您的位置:首页 > 编程语言 > Java开发

Java 多线程(二)线程间的通信应用--生产者消费者(未完)

2016-11-29 00:00 706 查看


对于多个生产者和消费者。
为什么要定义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();
}
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: