使用阻塞队列完成生产者消费者模式
package presonBlogs;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import com.sun.org.apache.bcel.internal.generic.NEW;
class Cat{
private volatile boolean FLAG = true;
private BlockingQueue blockingQueue;
private AtomicInteger atomicInteger = new AtomicInteger();
public Cat(BlockingQueue<String> blockingQueue) {//使用接口可兼容多种阻塞类
this.blockingQueue = blockingQueue;
System.out.println(blockingQueue.getClass().getName());
}
public void add() throws Exception {//生产
String data = null;
boolean result;
while(FLAG) {
data = atomicInteger.incrementAndGet()+"";
result = blockingQueue.offer(data, 2L, TimeUnit.SECONDS);
if(result) {
System.out.println(Thread.currentThread().getName()+"插入队列:"+data+"成功!");
}else {
System.out.println(Thread.currentThread().getName()+"插入队列:"+data+"失败!");
}
Thread.sleep(1000);
}
System.out.println(Thread.currentThread().getName()+"大老板叫停了");
}
public void reduce() throws InterruptedException {//消费
String result;
while(FLAG) {
result = (String) blockingQueue.poll(2L,TimeUnit.SECONDS);
if(result == null || result.equalsIgnoreCase("") ) {
System.out.println(Thread.currentThread().getName()+"超过2秒没有获取蛋糕,退出");
FLAG = false;
return;
}
System.out.println(Thread.currentThread().getName()+"消费"+result+"成功");
}
System.out.println(Thread.currentThread().getName()+"大老板叫停了,退出");
}
public void stop() {//停止
FLAG = false;
System.out.println(Thread.currentThread().getName()+"大老板叫停了设为FLAG");
}
}
public class BlockQueueDemo {
public static void main(String[] args) throws InterruptedException {
Cat kongTiao = new Cat(new ArrayBlockingQueue<>(10));
for (int i = 1; i <=1; i++) {
final int tmp = i;
new Thread(()->{
try {
kongTiao.add();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
}
},"AA").start();
}
for (int i = 1; i <=1; i++) {
final int tmp = i;
new Thread(()->{
try {
kongTiao.reduce();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
}
},"BB").start();
}
Thread.sleep(5000);
kongTiao.stop();
}
}
输出:
java.util.concurrent.ArrayBlockingQueue
AA插入队列:1成功!
BB消费1成功
AA插入队列:2成功!
BB消费2成功
AA插入队列:3成功!
BB消费3成功
AA插入队列:4成功!
BB消费4成功
AA插入队列:5成功!
BB消费5成功
main大老板叫停了设为FLAG
AA大老板叫停了
BB超过2秒没有获取蛋糕,退出