LinkedBlockingQueue示例

来源:互联网 发布:中国电信网络承载策略 编辑:程序博客网 时间:2024/06/07 17:34
package mypack;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.TimeUnit;/* * 一台机器有三个任务:一个是制作吐司、 * 一个是给吐司涂上黄油、一个是给涂有黄油的吐司涂上果酱 * */class Toast{public enum Status{DRY,BUTTERED,JAMMED};private Status status=Status.DRY;private int idn;public Toast(int id){idn=id;}public void buttered() {status=Status.BUTTERED;}public void jam(){status=Status.JAMMED;}public int getId(){ return idn;}public String toString(){return "Toast:"+idn+" Status: "+status;}}class ToastQueue extends LinkedBlockingQueue<Toast>{}class Toaster implements Runnable{private ToastQueue dryQueue;private int count=0;private Random  rand=new Random(47);public Toaster(ToastQueue queue){dryQueue=queue;}@Overridepublic void run() {// TODO Auto-generated method stubtry{while(!Thread.interrupted()){TimeUnit.MILLISECONDS.sleep(200+rand.nextInt(300));Toast toast = new Toast(++count);System.out.println(toast);dryQueue.put(toast);}}catch(InterruptedException e){System.out.println("Toster Interrupt");}System.out.println("Toaster off");}}class Bufferer implements Runnable{private ToastQueue dryQueue;private ToastQueue bufferedQueue;public Bufferer(ToastQueue dryQueue,ToastQueue bufferedQueue){this.dryQueue=dryQueue;this.bufferedQueue=bufferedQueue;}@Overridepublic void run() {// TODO Auto-generated method stubtry{  while(!Thread.interrupted()){Toast toast = dryQueue.take();toast.buttered();bufferedQueue.put(toast);System.out.println(toast);  }}catch(InterruptedException e){System.out.println("Bufferer interrupt");}System.out.println("Bufferer off");}}class Jammer implements Runnable{private ToastQueue bufferedQueue;private ToastQueue jammedQueue;public Jammer(ToastQueue bufferedQueue,ToastQueue jammedQueue){this.bufferedQueue=bufferedQueue;this.jammedQueue=jammedQueue;}@Overridepublic void run() {// TODO Auto-generated method stubtry{while(!Thread.interrupted()){Toast toast = bufferedQueue.take();toast.jam();System.out.println(toast);jammedQueue.put(toast);}}catch(InterruptedException e){System.out.println("Jammer Interrupt");}System.out.println("Jammer Off");}}class Eat implements Runnable{private ToastQueue eatQueue;private int count=0;public Eat(ToastQueue eatQueue){this.eatQueue=eatQueue;}@Overridepublic void run() {// TODO Auto-generated method stubtry{while(!Thread.interrupted()){Toast toast = eatQueue.take();if(++count!=toast.getId()){System.out.println("Error");System.exit(0);}}}catch(InterruptedException e){System.out.println("eat interrupt");} System.out.println("eat off");}}public class EatToast {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stub    ToastQueue dryQueue=new ToastQueue();    ToastQueue bufferedQueue=new ToastQueue();    ToastQueue jammedQueue=new ToastQueue();    ExecutorService exec = Executors.newCachedThreadPool();    exec.execute(new Toaster(dryQueue));    exec.execute(new Bufferer(dryQueue,bufferedQueue));    exec.execute(new Jammer(bufferedQueue,jammedQueue));    exec.execute(new Eat(jammedQueue));    TimeUnit.SECONDS.sleep(5);    exec.shutdownNow();}}

0 0
原创粉丝点击