队列

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();
        }
    }
}
原文地址:https://www.cnblogs.com/Mustr/p/7182320.html