读书人

Java中BlcokingQueue的运用

发布时间: 2012-09-02 21:00:34 作者: rapoo

Java中BlcokingQueue的使用
直接上Thinking in Java 4th 的例子:

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


BlockingQueue提供了一种便捷的方式处理资源共享, 从而避免了用synchronized带来的繁琐, 以及用synchronized方法带来的死锁。


输出结果
Toast 0: DRYToast 0: BUTTEREDToast 0: JAMEDChomp! Toast 0: JAMEDToast 1: DRYToast 1: BUTTEREDToast 1: JAMEDChomp! Toast 1: JAMEDToast 2: DRYToast 2: BUTTEREDToast 2: JAMEDChomp! Toast 2: JAMEDToast 3: DRYToast 3: BUTTEREDToast 3: JAMEDChomp! Toast 3: JAMEDToast 4: DRYToast 4: BUTTEREDToast 4: JAMEDChomp! Toast 4: JAMEDToast 5: DRYToast 5: BUTTEREDToast 5: JAMEDChomp! Toast 5: JAMEDToast 6: DRYToast 6: BUTTEREDToast 6: JAMEDChomp! Toast 6: JAMEDToast 7: DRYToast 7: BUTTEREDToast 7: JAMEDChomp! Toast 7: JAMEDToast 8: DRYToast 8: BUTTEREDToast 8: JAMEDChomp! Toast 8: JAMEDToast 9: DRYToast 9: BUTTEREDToast 9: JAMEDChomp! Toast 9: JAMEDToast 10: DRYToast 10: BUTTEREDToast 10: JAMEDChomp! Toast 10: JAMEDToast 11: DRYToast 11: BUTTEREDToast 11: JAMEDChomp! Toast 11: JAMEDToast 12: DRYToast 12: BUTTEREDToast 12: JAMEDChomp! Toast 12: JAMEDToast 13: DRYToast 13: BUTTEREDToast 13: JAMEDChomp! Toast 13: JAMEDToast 14: DRYToast 14: BUTTEREDToast 14: JAMEDChomp! Toast 14: JAMEDEater interrupted !Eater offJammer Interruped Jammer offButterer interruptedButter offToaster interruptedToaster off

读书人网 >编程

热点推荐