⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 waitnotify.java

📁 本代码以J2SE 5.0为开发环境
💻 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();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -