Java多线程和并发编程实践的学习心得1----基础篇
一java线程的基本知识
2、线程和进程的区别:
- 每个进程都有独立的代码和数据空间,进程间切换会有较大的开销;
- 线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器,线程切换的开销小;
- 多进程:在操作系统能同时运行多个任务;
- 多线程:在同一程序中有多个顺序流同时执行。
- 通过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类。
java线程的优先级:
java线程的优先级从1到10: Thread.MAX_PRIORITY = 10;
Thread.MIN_PRIORITY= 1;
Thread.NORM_PRIORITY= 5;
使用如下方法操作优先级: int getPriority();
voidsetPriority(int i);
还有一个比较重要的方法: 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线程,一个计数器线程,还有一个是垃圾回收器线程。程序很简单。