您的位置:首页 > 编程语言 > Java开发

Java多线程和并发编程实践的学习心得----基础篇

2014-10-23 20:16 741 查看

Java多线程和并发编程实践的学习心得1----基础篇

一java线程的基本知识

1、线程:线程是程序运行的基本执行单元,线程是一个程序内部的顺序控制流。进程是操作系统中一个个独立的运行单元。每个进程独享一块内存空间。

2、线程和进程的区别:

每个进程都有独立的代码和数据空间,进程间切换会有较大的开销;
线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器,线程切换的开销小;
多进程:在操作系统能同时运行多个任务;
多线程:在同一程序中有多个顺序流同时执行。





上图是java的一个进程中有2个线程在JVM(java虚拟机中)的抽象运行模型,很好理解。

3、线程的创建与启动

方法一:实现Runnable接口。

通过Thread th = new Thread(target);//targer为实现Runnable接口对象;
其中Runnable接口只有一个方法:public void run()//用于定义线程运行体;
Runnable接口可以为多个线程提供共享的数据;
在实现Runnable接口的类的run()方法定义中可以使用Thread的静态方法:
public static Thread currentThread()获取当前线程的引用。

方法二:定义一个Thread的子类并重写其run()方法。
生成该类的对象:MyThread mt = new MyThread();//MyThread继承Thread类。

4、

java线程的优先级:

java线程的优先级从1到10: Thread.MAX_PRIORITY = 10;

Thread.MIN_PRIORITY= 1;

Thread.NORM_PRIORITY= 5;

使用如下方法操作优先级: int getPriority();

voidsetPriority(int i);

5、线程控制的基本方法

这是一个很经典的java线程的控制状态图:






这个也是很经典的java线程控制方法,很基础的方法,但很有用。在后面可能还会经常的见到他们。






还有一个比较重要的方法: sleep方法:线程的静态方法:publicstatic void sleep(long millis) throws InterruptedException使当前线程休眠long毫秒。由于是静态方法,可以由线程直接调用:Thread.sleep(...);

6、线程间的通信






上图是JMM(Java内存模型)中线程之间通信的模型图。仔细体会。

多线程重在思想,重在理解。下面就贴上多线程入门的线程计数器的例子程序:

package com.qyl.dome1;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

class SeparateSubTask extends Thread{
private int count = 0;
private Counter2 c2;
private boolean runFlag = true;

public SeparateSubTask(Counter2 c2){
this.c2 = c2;
this.start();
}

public void invertFlag(){
runFlag = !runFlag;
}

public void run(){
while(true){
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println(runFlag);

if (runFlag){
c2.tF.setText(Integer.toString(count++));

}
}
}

}

public class Counter2 extends Applet {

private Button onOff = new Button("Toggle");
private Button start = new Button("Start");

TextField tF = new TextField(10);

private SeparateSubTask sp;

public void init() {
this.add(tF);
this.add(onOff);
this.add(start);

start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(sp==null)
sp = new SeparateSubTask(Counter2.this);
}
});

onOff.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(sp != null)
sp.invertFlag();
}
});

}

public static void main(String[] args) {

Counter2 applet = new Counter2();
Frame mFrame = new Frame();
mFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
mFrame.add(applet, BorderLayout.CENTER);
mFrame.setSize(300, 200);
applet.init();
applet.start();
mFrame.setVisible(true);
}

}
这里面主要有3个线程,一个UI线程,一个计数器线程,还有一个是垃圾回收器线程。程序很简单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: