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();
}
}
}