14.4 线程的通讯

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


例子就是生产者与消费者关系


wait():等待。如果线程执行了wait方法,那么该线程会进入等待的状态
notify():唤醒等待的线程


注意:
1、wait和notify方法是属于Objeck类的。
2、wait和notify方法必须是要找同步代码块或者同步函数中才能使用。

3、wait和notify方法必须要锁对象调用。


class Product extends Thread
{
	String name;
	double price;
	boolean flag = false;//为flase就表示没有产品,所以要生产
	
}

class Producers extends Product
{
	Product p;
	int i=0;
	
	Producers(Product p)
	{
		this.p = p;
	}
	public void run()
	{
		while(true)
		{ 
			synchronized(p)
			{
				if(false == flag)//没有产品就生产
			     {
				
								if(0 == i%2)
								{
									p.name="苹果";
									p.price=6;
									//p.sleep(1000);
									
								}
								else
								{
					
									p.name="火龙果";
									p.price=3;	
									
								}	
								i++;
								p.flag = true;
								System.out.println("生产者生产了"+p.name+"价格为="+p.price);	
								p.notify();//生产完就唤醒消费
						    }
				     
					else//有产品就等待消费
					{
						try {
							p.wait();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}	
					}	
			}
		}
	}
}

class Consumers extends Product
{
	Product p;
	Consumers(Product p)
	{
		 this.p = p;
	}
	
	public void run()
	{
		//有产品就消费,没有产品就生产
		while(true)
		{  
			
			synchronized(p)
			{
				if( true == p.flag)
				{
				System.out.println("消费者消费了"+p.name+"价格为="+p.price);	
				p.flag  = false;
				p.notify();
			    }
				else 
				{
					System.out.println("没有可以消费的产品,等待生产");	
					try {
						p.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}	
					
				}
			}
		}
	}
}

public class wu
{
public static void main(String [] args)	
{
	Product p = new Product();
	Producers producers = new Producers(p);
	Consumers  consumer = new Consumers(p);
	producers.start();
	consumer.start();	
	
}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值