上一篇是普通版的生产消费模式,需要我们手动阻塞唤醒线程,这个使用阻塞队列实现,省去阻塞唤醒,只需要修改Flag标志位即可。
package lock;
import java.sql.Time;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author Mr.Zhao
* @Description: 资源类,生产手机,销售手机
* @date 2019/12/26 21:25
* @version 1.0
*/
class MyResource{
//产业链正常运行,false,非正常运行
private volatile boolean Flag = true;
private AtomicInteger atomicInteger = new AtomicInteger();
//传接口,提升程序可扩展性
BlockingQueue<String> blockingQueue = null;
public MyResource(BlockingQueue<String> blockingQueue) {
this.blockingQueue = blockingQueue;
}
//工厂加工手机
public void product(){
String data = null;
while (Flag) {
data = String.valueOf(atomicInteger.incrementAndGet());
boolean offer = false;
try {
offer = blockingQueue.offer(data, 2L, TimeUnit.SECONDS);
if (offer) {
System.out.println(Thread.currentThread().getName() + "成功生产第" + data + "台手机!");
} else {
System.out.println(Thread.currentThread().getName() + "生产第" + data + "台手机失败!");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "停止生产!");
}
//商铺售卖手机
public void consumer(){
String poll = null;
while (Flag) {
try {
poll = blockingQueue.poll(2L, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
// poll = blockingQueue.poll();
//判断工厂里是否有手机
if (null == poll || poll.equalsIgnoreCase("")) {
System.out.println(Thread.currentThread().getName() + "关闭,退出!");
return;
}
System.out.println(Thread.currentThread().getName() + "售卖出第" + poll + "台手机!");
}
}
public void stop(){
this.Flag = false;
}
}
/**
* @author Mr.Zhao
* @version 1.0
* @Description: 使用阻塞队列实现生产者消费者模式
* @date 2019/12/26 21:25
*/
public class ProductConsumer_BlockQueueDemo {
public static void main(String[] args) {
MyResource myResource = new MyResource(new ArrayBlockingQueue<String>(3));
new Thread(() -> {
System.out.println("工厂启动");
myResource.product();
}, "工厂").start();
new Thread(() ->{
System.out.println("商铺启动");
myResource.consumer();
}, "商铺").start();
try {
TimeUnit.SECONDS.sleep(5);
System.out.println();
System.out.println();
System.out.println("停止一切工作");
myResource.stop();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}