吐司BlockingQueue

2024-06-05 20:48
文章标签 吐司 blockingqueue

本文主要是介绍吐司BlockingQueue,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有一台机器具有三个任务:一个制作吐司、一个给吐司摸黄油、另一个在抹过黄油的吐司上涂果酱。我们可以通过各个处理过程之间的BlockingQueue来运行这个吐司制作程序。也就说我们可以利用三个线程安全的阻塞队列LinkedBlockingQueue,一个任务完成后就把这个Toast放到下一个队列中,维护三个队列就能做到了。

class Toast {public enum Status {DRY, BUTTERED, JAMMED} private Status status = Status.DRY;private final int id;public Toast(int idn) {id = idn;}public void butter() {status = Status.BUTTERED;}public void jam() {status = Status.JAMMED;}public Status getStatus() {return status;}public int getId() {return id;}public String toString() {return "Toast " + id + ": " + status;}
}class ToastQueue extends LinkedBlockingQueue<Toast> {}class Toaster implements Runnable {private ToastQueue toastQueue;private int count = 0;private Random rand = new Random(47);public Toaster(ToastQueue tq) {toastQueue = tq;}@Overridepublic void run() {try {while (!Thread.interrupted()) {TimeUnit.MILLISECONDS.sleep(100 + rand.nextInt(500));Toast t = new Toast(count++);System.out.println(t);toastQueue.put(t);}} catch (InterruptedException e) {System.out.println("Toaster interrupted");}System.out.println("Toaster off");}
}class Butterer implements Runnable {private ToastQueue dryQueue, butteredQueue;public Butterer(ToastQueue dry, ToastQueue buttered) {this.dryQueue = dry;this.butteredQueue = buttered;}@Overridepublic void run() {try {while (!Thread.interrupted()) {Toast t = this.dryQueue.take();t.butter();System.out.println(t);butteredQueue.put(t);}} catch (InterruptedException e) {System.out.println("Butterer interrputed");}System.out.println("Butterer off");}
}class Jammer implements Runnable {private ToastQueue butteredQueue, finishedQueue;public Jammer(ToastQueue buttered, ToastQueue finished) {this.butteredQueue = buttered;this.finishedQueue = finished;}@Overridepublic void run() {try {while (!Thread.interrupted()) {Toast t = butteredQueue.take();t.jam();System.out.println(t);finishedQueue.add(t);}} catch (InterruptedException e) {System.out.println("Jammer interrupted");}System.out.println("Jammer off");}
}class Eater implements Runnable {private ToastQueue finishedQueue;private int counter = 0;public Eater(ToastQueue finished) {this.finishedQueue = finished;}@Overridepublic void run() {try {while (!Thread.interrupted()) {Toast t = finishedQueue.take();if (t.getId() != counter++ || t.getStatus() != Toast.Status.JAMMED) {System.out.println(">>>> Error: " + t);System.exit(1);} else System.out.println("Chomp! " + t);}} catch (InterruptedException e) {System.out.println("Eater interrupted");}System.out.println("Eater off");}
}public class ToastOMatic {public static void main(String[] args) throws Exception{ToastQueue dryQueue = new ToastQueue(),butteredQueue = new ToastQueue(),finishedQueue = new ToastQueue();ExecutorService exec = Executors.newCachedThreadPool();exec.execute(new Toaster(dryQueue));exec.execute(new Butterer(dryQueue, butteredQueue));exec.execute(new Jammer(butteredQueue, finishedQueue));			   exec.execute(new Eater(finishedQueue));TimeUnit.SECONDS.sleep(5);exec.shutdownNow();}
}


这篇关于吐司BlockingQueue的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1034136

相关文章

Java并发编程之——BlockingQueue(队列)

一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作123 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空

Java必知必会---队列BlockingQueue家族

Java必知必会---队列BlockingQueue家族 IT小鳄鱼  2017-12-04 19:21:35 Java必知必会---队列BlockingQueue家族   队列是我们在开发中经常会使用到的一种数据结构,并且在多线程资源共享与数据协调的场景中,队列也是我们最喜欢的选择之一,尤其是在生产者与消费者模型中。下面我们就介绍一下在java中常用的BlockingQueue家

LinkedBlockingQueue比BlockingQueue吞吐量高的原因?

目录 1.首先吞吐量是什么?如何衡量程序的吞吐量?2. LinkedBlockingQueue 吞吐量高的原因? 1.首先吞吐量是什么?如何衡量程序的吞吐量? 吞吐量是指在一定时间内系统或程序处理的任务数量或数据量。在计算机领域,吞吐量通常用来衡量系统、程序或设备在单位时间内处理的工作量或数据量,是评估系统性能的重要性能之一。可以从吞吐量通常可以通过以下方式进行衡量: 任务完成数

BlockingQueue 接口源码学习

java version “1.8.0_221” Java™ SE Runtime Environment (build 1.8.0_221-b11) Java HotSpot™ 64-Bit Server VM (build 25.221-b11, mixed mode) 介绍 BlockingQueue 是一个接口,并且它还继承了 Queue 接口,在继承 Queue 接口的基础上,

12、深入解析阻塞队列BlockingQueue

深入解析阻塞队列BlockingQueue 阻塞队列介绍队列Queue接口阻塞队列应用场景 JUC包下的阻塞队列 ArrayBlockingQueueArrayBlockingQueue使用ArrayBlockingQueue的原理数据结构入队put方法为什么ArrayBlockingQueue对数组操作要设计成双指针?出队take方法 LinkedBlockingQueueLinkedB

BlockingQueue简单使用

明确BlockingQueue的作用以及使用场景;悉知BlockingQueue的基本使用 1、BlockingQueue一般用于排队的列子,比如多线程的批量下载或者上传,有效控制队列高效执行, 2、BlockingQueue的实例化以及怎么去使用 //实例化BlockingQueue并指定队列的容量为10 ,超出10将会阻塞,直到basket.take()消费才会继续添加进队列中去pr

线程池原理--任务队列BlockingQueue

文章目录 线程池原理--任务队列BlockingQueue类继承体系接口抽象方法实现类ArrayBlockingQueueSynchronousQueueLinkedBlockingDequeLinkedBlockingQueueDelayQueueLinkedTransferQueuePriorityBlockingQueue 线程池原理–总索引 线程池原理–任务队列B

并发之BlockingQueue

并发包中BlockingQueue的类关系图如下: public interface BlockingQueue<E> extends Queue<E> {/*** 往队尾增加元素,如果队列已满则抛出IllegalStateException异常*/boolean add(E e);/*** 往队尾增加元素,如果队列满则返回false*/boolean offer(E e);/*** 往队尾

阻塞队列BlockingQueue(FIFO)

一:简介 阻塞队列:从定义上来说是队列的一种,那么肯定是一个先进先出(FIFO)的数据结构。与普通队列不同的是,它支持两个附加操作,即阻塞添加和阻塞删除方法。 阻塞添加:当阻塞队列是满时,往队列里添加元素的操作将被阻塞。 阻塞移除:当阻塞队列是空时,从队列中获取元素/删除元素的操作将被阻塞。 二:java中对阻塞队列的定义 BlockingQueue接口与Queue接口【Queue 和 Bl

J.U.C系列(五)BlockingQueue的使用

BlockingQueue java.util.concurrent.BlockingQueue 接口有以下阻塞队列的实现: FIFO 队列 :LinkedBlockingQueue、ArrayBlockingQueue(固定长度) 优先级队列 :PriorityBlockingQueue提供了阻塞的 take() 和 put() 方法:如果队列为空 take() 将阻塞,直到队列中有内容;如