用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

java 线程间的协作

2012-11-23 作者: 程序猿style举报

[java]代码库

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();
	}
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...