public 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; } public String toString() { return "Toast--"+id+":"+status; } }
public class ToastQueue extends LinkedBlockingQueue<Toast>{ private static final long serialVersionUID = -5810260681478300825L; }
public class Toaster implements Runnable { private ToastQueue toastQueue; public Toaster(ToastQueue toastQueue) { this.toastQueue = toastQueue; } private int count = 0; private Random random = new Random(47); @Override public void run() { try { while (!Thread.interrupted()) { TimeUnit.MILLISECONDS.sleep(100+random.nextInt(2000)); Toast t = new Toast(count++);//生产吐司 System.out.println(t); toastQueue.put(t); //加入到第一步 } } catch (InterruptedException e) { System.out.println("toaster....."); } System.out.println("toaster off!"); } }
public class Butter implements Runnable{ private ToastQueue dayQueue,butterQueue; public Butter(ToastQueue dayQueue,ToastQueue butterQueue) { this.dayQueue = dayQueue; this.butterQueue = butterQueue; } @Override public void run() { try { while (!Thread.interrupted()) { Toast t = dayQueue.take(); //从第一步处理中获取过来 t.butter(); //改变状态 System.out.println(t); butterQueue.put(t); //加入到第二步 } } catch (InterruptedException e) { System.out.println("butter...."); } System.out.println("butter off!"); } }
public class Jam implements Runnable { private ToastQueue butterQueue, finishQueue; public Jam(ToastQueue butterQueue, ToastQueue finishQueue) { this.butterQueue = butterQueue; this.finishQueue = finishQueue; } @Override public void run() { try { while (!Thread.interrupted()) { Toast t = butterQueue.take();// 从第二步中获取到吐司 t.jam(); // 改变状态 System.out.println(t); finishQueue.put(t);// 加入到第三步 } } catch (InterruptedException e) { System.out.println("jam..."); } System.out.println("Jam off!"); } }
public class Eater implements Runnable{ private ToastQueue finishQueue; private int counter = 0 ; public Eater (ToastQueue finishQueue) { this.finishQueue = finishQueue; } @Override public void run() { try { while (!Thread.interrupted()) { Toast t = finishQueue.take(); if (t.getId() != counter++ || t.getStatus() != Toast.Status.JAMED) { System.out.println(">>>error:" +t); System.exit(1); } else { System.out.println("over! " + t); } } } catch (InterruptedException e) { System.out.println("eater...."); } System.out.println("Eater off!"); } }
public class Main { public static void main(String[] args) { ToastQueue dryQueue = new ToastQueue(); ToastQueue butterQueue =new ToastQueue(); ToastQueue finishQueue = new ToastQueue(); ExecutorService exec = Executors.newCachedThreadPool(); try { exec.execute(new Toaster(dryQueue)); exec.execute(new Butter(dryQueue,butterQueue)); exec.execute(new Jam(butterQueue,finishQueue)); exec.execute(new Eater(finishQueue)); TimeUnit.MILLISECONDS.sleep(1000000);//不能太小 exec.shutdownNow(); } catch (InterruptedException e) { e.printStackTrace(); } } }