线程通讯:一个线程完成自己的任务时,就要通知另外一个线程去
例子就是生产者与消费者关系
wait():等待。如果线程执行了wait方法,那么该线程会进入等待的状态
notify():唤醒等待的线程
注意:
1、wait和notify方法是属于Objeck类的。
2、wait和notify方法必须是要找同步代码块或者同步函数中才能使用。
例子就是生产者与消费者关系
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();
}
}