Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

线程4--线程的协作

Posted on 2009-06-02 20:19 啥都写点 阅读(182) 评论(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();
    }
}



                                                                                                       --    学海无涯