同步队列协作线程

来源:互联网 发布:为什么淘宝一支独秀 编辑:程序博客网 时间:2024/05/18 12:30

java提供一系列的同步队列来协作线程通信,简化程序编写,并且在类与类之间也解耦了。
代码例子:

//吐司类class Toast {      public enum Status { DRY, BUTTERED, JAMMED }      private Status status = Status.DRY;      private final int id;      public Toast(int idn) { id = idn; }      public void butter() { status = Status.BUTTERED; }      public void jam() { status = Status.JAMMED; }      public Status getStatus() { return status; }      public int getId() { return id; }      public String toString() {        return "Toast " + id + ": " + status;      }    }    //同步队列    class ToastQueue extends LinkedBlockingQueue<Toast> {}    //代表制作吐司过程的类    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++);            System.out.println(t);            // 插入队列            toastQueue.put(t);          }        } catch(InterruptedException e) {            System.out.println("Toaster interrupted");        }        System.out.println("Toaster off");      }    }    // 添加黄油    class Butterer implements Runnable {        //吐司队列,以及添加完黄油的吐司队列      private ToastQueue dryQueue, butteredQueue;      public Butterer(ToastQueue dry, ToastQueue buttered) {        dryQueue = dry;        butteredQueue = buttered;      }      public void run() {        try {          while(!Thread.interrupted()) {            // 拿吐司            Toast t = dryQueue.take();            t.butter();            System.out.println(t);            //入添加完黄油的队列            butteredQueue.put(t);          }        } catch(InterruptedException e) {            System.out.println("Butterer interrupted");        }        System.out.println("Butterer off");      }    }    // 涂果酱    class Jammer implements Runnable {        //添加黄油 的队列,制作完成的队列      private ToastQueue butteredQueue, finishedQueue;      public Jammer(ToastQueue buttered, ToastQueue finished) {        butteredQueue = buttered;        finishedQueue = finished;      }      public void run() {        try {          while(!Thread.interrupted()) {            // 拿已添加黄油的吐司            Toast t = butteredQueue.take();            t.jam();            System.out.println(t);            finishedQueue.put(t);          }        } catch(InterruptedException e) {            System.out.println("Jammer interrupted");        }        System.out.println("Jammer off");      }    }    // 消费吐司    class Eater implements Runnable {      private ToastQueue finishedQueue;      private int counter = 0;      public Eater(ToastQueue finished) {        finishedQueue = finished;      }      public void run() {        try {          while(!Thread.interrupted()) {            // 那制作好的吐司            Toast t = finishedQueue.take();            if(t.getId() != counter++ ||               t.getStatus() != Toast.Status.JAMMED) {                System.out.println(">>>> Error: " + t);              System.exit(1);            } else                System.out.println("Chomp! " + t);          }        } catch(InterruptedException e) {            System.out.println("Eater interrupted");        }        System.out.println("Eater off");      }    }    public class ToastOMatic {      public static void main(String[] args) throws Exception {        ToastQueue dryQueue = new ToastQueue(),                   butteredQueue = new ToastQueue(),                   finishedQueue = new ToastQueue();        ExecutorService exec = Executors.newCachedThreadPool();        exec.execute(new Toaster(dryQueue));        exec.execute(new Butterer(dryQueue, butteredQueue));        exec.execute(new Jammer(butteredQueue, finishedQueue));        exec.execute(new Eater(finishedQueue));        TimeUnit.SECONDS.sleep(5);        exec.shutdownNow();      }    }

运行结果:
Toast 0: DRY
Toast 0: BUTTERED
Toast 0: JAMMED
Chomp! Toast 0: JAMMED
Toast 1: DRY
Toast 1: BUTTERED
Toast 1: JAMMED
Chomp! Toast 1: JAMMED
Toast 2: DRY
Toast 2: BUTTERED
Toast 2: JAMMED
Chomp! Toast 2: JAMMED
Toast 3: DRY
Toast 3: BUTTERED
Toast 3: JAMMED
Chomp! Toast 3: JAMMED
Toast 4: DRY
Toast 4: BUTTERED
Toast 4: JAMMED
Chomp! Toast 4: JAMMED
Toast 5: DRY
Toast 5: BUTTERED
Toast 5: JAMMED
Chomp! Toast 5: JAMMED
Toast 6: DRY
Toast 6: BUTTERED
Toast 6: JAMMED
Chomp! Toast 6: JAMMED
Toast 7: DRY
Toast 7: BUTTERED
Toast 7: JAMMED
Chomp! Toast 7: JAMMED
Toast 8: DRY
Toast 8: BUTTERED
Toast 8: JAMMED
Chomp! Toast 8: JAMMED
Toast 9: DRY
Toast 9: BUTTERED
Toast 9: JAMMED
Chomp! Toast 9: JAMMED
Toast 10: DRY
Toast 10: BUTTERED
Toast 10: JAMMED
Chomp! Toast 10: JAMMED
Toast 11: DRY
Toast 11: BUTTERED
Toast 11: JAMMED
Chomp! Toast 11: JAMMED
Toast 12: DRY
Toast 12: BUTTERED
Toast 12: JAMMED
Chomp! Toast 12: JAMMED
Toast 13: DRY
Toast 13: BUTTERED
Toast 13: JAMMED
Chomp! Toast 13: JAMMED
Toast 14: DRY
Toast 14: BUTTERED
Toast 14: JAMMED
Chomp! Toast 14: JAMMED
Butterer interrupted
Butterer off
Toaster interrupted
Toaster off
Eater interrupted
Eater off
Jammer interrupted
Jammer off

0 0
原创粉丝点击