import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
*
*/
public class ProdConsumerBlockQueueDemo {
public static void main(String[] args) {
final MyResource myResource = new MyResource(new ArrayBlockingQueue<>(10));
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程启动");
try {
myResource.myProd();
} catch (Exception e) {
e.printStackTrace();
}
}
},"生产");
thread.start();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程启动");
try {
myResource.myConsumer();
} catch (Exception e) {
e.printStackTrace();
}
}
},"消费");
thread1.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"线程5秒钟后叫停,活动结束");
myResource.stop(false);
}
}
class MyResource{
private volatile boolean FLAG = true;
private AtomicInteger atomicInteger = new AtomicInteger();
BlockingQueue blockingQueue = null;
MyResource(BlockingQueue blockingQueue){
this.blockingQueue = blockingQueue;
}
public void myProd() throws Exception{
String data = "";
boolean retValue;
while (FLAG){
data = atomicInteger.incrementAndGet() + "";
retValue = blockingQueue.offer(data,2L, TimeUnit.SECONDS);
if(retValue){
System.out.println(Thread.currentThread().getName()+"插入队列"+data+"成功");
}else {
System.out.println(Thread.currentThread().getName()+"插入队列"+data+"失败");
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
System.out.println(Thread.currentThread().getName() + " 大老板叫停了 表示flag=false,生产动作结束");
}
public void myConsumer() throws Exception{
Object retValue = null;
while (FLAG){
retValue = blockingQueue.poll(2L, TimeUnit.SECONDS);
if(null ==retValue ||retValue.equals("")){
FLAG = false;
System.out.println(Thread.currentThread().getName()+"超过2秒没有取到蛋糕,消费退出");
return;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"队列蛋糕"+retValue+"成功");
}
}
public void stop(boolean FLAG) {
this.FLAG = FLAG;
}
}
BlockQueue 生产消费 不需要判断阻塞唤醒条件
最新推荐文章于 2023-07-17 16:35:04 发布