对于多个生产者和消费者。
为什么要定义while判断标记。
原因:让被唤醒的线程再一次判断标记。
为什么定义notifyAll,
因为需要唤醒对方线程。
因为只用notify,容易出现只唤醒本方线程的情况。导致程序中的所有线程都等待。
启动主类
/**
*
*/
package threadCommnication;
/**
* <p>Title: InputOutputDemo</p>
* <p>Description: </p>
* <p>Company: </p>
* @author 夏 杰
* @date 2015年12月12日 下午8:40:53
* @vesion 1.0
*/
public class ConsumerProducerDemo {
public static void main(String[] args) {
Resource resource = new Resource();
Producer producer = new Producer(resource);
Consumer consumer = new Consumer(resource);
//启动生产者线程
new Thread(producer).start();
//启动消费者线程
new Thread(consumer).start();
}
}
所要生产的资源
/**
*
*/
package threadCommnication;
public class Resource {
String name;
private int count = 1;
/**
* 标志位
* flag = false 表示没有资源了,要生产,消费者不能取
* flage = ture 表示有资源,不要生产,消费者可以取
*/
private boolean flag = false;
public synchronized void set(String name) throws InterruptedException{
if(flag == true){
//当已经有资源时要等待消费者取走后,才能生产
this.wait();
}else {
//当没有资源时,继续生产
this.name = name+"--"+count++;
System.out.println(Thread.currentThread().getName()+"---生产者---"+this.name);
flag = true;
//当生产了后,通知等待的消费者来取
this.notify();
}
}
public synchronized void out() throws InterruptedException{
if(flag == true){
//当有资源时可以取走
System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
flag = false;
//通知生产者可以继续生产
this.notify();
}else{
//当没有资源时等待生产者生产
this.wait();
}
}
}
生产者
/**
*
*/
package threadCommnication;
public class Producer implements Runnable{
private Resource resource;
boolean flag = false;
//保证传入对象唯一性
public Producer(Resource resource) {
this.resource = resource;
}
@Override
public synchronized void run() {
while(true){
try {
resource.set("+商品+");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
消费者
/**
*
*/
package threadCommnication;
public class Consumer implements Runnable{
private Resource resource;
public Consumer(Resource resource){ //保证传入对象唯一性
this.resource = resource;
}
@Override
public synchronized void run() {
while(true)
{
try {
resource.out();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}