/* 等待的目的是让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(); } }