Posted on 2009-06-02 20:19
啥都写点 阅读(181)
评论(0) 编辑 收藏 所属分类:
J2SE
关键技术:
- 在synchronized代码块中使用wait方法,能够使当前线程进入等待状态,并释放当前线程拥有的对象锁。
- 在synchronized代码块中使用notify或者notifyAll方法,当前线程释放对象锁,并唤醒其他正在等待该对象锁的线程。当有多个线程都在等待该对象锁时,由Java虚拟机决定被唤醒的等待线程。
package book.thread;
import java.util.Vector;
/**
* 线程间的协作
*/
public class WaitNotify {
/**
* 打印信息的类,是一个线程。
*/
static class Printer extends Thread{
Vector task = new Vector();
boolean running = false;
public void start(){
this.running = true;
super.start();
}
public void run(){
try {
System.out.println("Printer begin!");
while (running){
synchronized(this) {
while ((task.size() == 0) && running){
//如果任务列表为空,而且线程还允许运行,则等待任务
System.out.println("wait begin!");
//该线程进入等待状态,直到被其他线程唤醒
wait();
System.out.println("wait end!");
}
}
if (running){
System.out.println("print the task: " + task.remove(0));
}
}
System.out.println("Printer end!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 添加待打印的任务
*/
public void addTask(String str){
synchronized (this){
this.task.add(str);
//唤醒其他等待的线程
System.out.println("addTask notify!");
notify();
//notifyAll();
}
}
/**
* 停止线程
*/
public void stopPrinter(){
this.running = false;
synchronized (this){
//唤醒其他等待的线程
System.out.println("stopPrinter notify!");
notify();
}
}
}
public static void main(String[] args) {
Printer printer = new Printer();
//启动打印线程
printer.start();
//添加任务
try {
Thread.sleep(200);
for (int i=0; i<5; i++){
//休眠200毫秒
Thread.sleep(200);
printer.addTask("The task " + i);
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
printer.stopPrinter();
}
}
-- 学海无涯