/*
等待的目的是让cpu给其他线程。
*/
class Resource
{
private String name;
private int count = 0;
private boolean flag = false;
Resource(String name)
{
this.name = name;
}
public synchronized void product()
{
while(flag) //此处如果是if的效果
{
try
{
wait();
}
catch (InterruptedException ex)
{
}
}
this.name = "---"+this.count;
System.out.println(Thread.currentThread().getName() + "生产者---" + this.name);
flag = true;
this.count++;
this.notify();
}
public synchronized void consume()
{
while(!flag) //此处如果是if的效果,如果某个线程被wait,接着又一个,然后两个都醒了,就会造成对一个产品两次消费
{
try
{
wait();
}
catch (InterruptedException ex)
{
}
}
System.out.println(Thread.currentThread().getName() + "消费者---------" + this.name);
flag = false;
this.notify();
}
}
class Product implements Runnable
{
private Resource sr;
Product(Resource sr)
{
this.sr = sr;
}
public void run()
{
while(true)
{
if(sr != null)
{
sr.product();
}
}
}
}
class Consume implements Runnable
{
private Resource sr;
Consume(Resource sr)
{
this.sr = sr;
}
public void run()
{
while(true)
{
if(sr != null)
{
sr.consume();
}
}
}
}
class DemoRunnable
{
public static void main(String[] args)
{
Resource sr = new Resource("产品");
Product p = new Product(sr);
Consume c =new Consume(sr);
Thread t1 = new Thread(p);
Thread t2 = new Thread(p);
Thread c1 = new Thread(c);
Thread c2 = new Thread(c);
Thread c3 = new Thread(c);
t1.start();
t2.start();
c1.start();
c2.start();
c3.start();
}
}