A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

线程通讯: 一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务.

生产者与消费者


wait():  等待   如果线程执行了wait方法,那么该线程会进入等待的状态,等待状态下的线程必须要被其他线程调用notify方法才能唤醒。
notify(): 唤醒    唤醒线程池等待线程其中的一个。
notifyAll() : 唤醒线程池所有等待 线程。


wait与notify方法要注意的事项:
        1. wait方法与notify方法是属于Object对象 的。
        2. wait方法与notify方法必须要在同步代码块或者是同步函数中才能 使用。
        3. wait方法与notify方法必需要由锁对象调用。
       
[Java] 纯文本查看 复制代码
public class Product {
	//名字
	String name ;
	//价格
	double price;
	boolean flag = false;
}




[Java] 纯文本查看 复制代码
/*
 * 生产者类
 */
 class Producer extends Thread {	
	// 产品
	Product p;
public Producer(Product p) {
		this.p = p;
	}
	@Override
public void run() {
		// 重写run()
		int i = 0;
		while (true) {
			synchronized(p) {
				if (p.flag == false) {
					if (i % 2 == 0) {
						p.name = "苹果";
						p.price = 6.5;
					} else {
						p.name = "香蕉";
						p.price = 2.0;
					}
					System.out.println("生产者生产出了" + p.name + " : " + p.name + "价格是" + p.price);
					p.flag = true;
					i++;
					p.notifyAll();// 唤醒消费者去消费
				} else {
					// 已经生产 完毕,等待消费者先去消费
					try {
						p.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
}

[Java] 纯文本查看 复制代码
package day_17_duxiancheng;
/*
 * 消费者类
 */
public class Customer extends Thread{
	
	Product p;//产品
	//构造方法
	public Customer(Product p) {
		
		this.p = p;
	}	
@Override
public void run() {
	while(true){
		synchronized (p) {
			if(p.flag==true){
				System.out.println("消费者消费了一个"+p.name+" : "+p.name+"的价格是"+p.price+"元");
				p.flag=false;
				p.notifyAll();
			}else{
				//等待生产者生产产品
				try {
					p.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
}
}
[AppleScript] 纯文本查看 复制代码
public class Tese {

	public static void main(String[] args) {
		 //创建产品对象
		Product p = new Product();
		//创建生产者对象
		Producer producer = new Producer(p);
		//创建消费者对象
		Customer customer = new Customer(p);
		//启动生产者多线程
		producer.start();
		//启动消费者多线程
		customer.start();

	}

}

评分

参与人数 1黑马币 +10 收起 理由
播妞 + 10 不错不错,播妞奖励下!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马