同步队列协作线程
来源:互联网 发布:为什么淘宝一支独秀 编辑:程序博客网 时间: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
- 同步队列协作线程
- 线程间的协作同步
- Python 线程同步队列
- win32 线程同步缓冲队列
- 线程同步与双队列
- 线程同步与双队列
- 使用队列让线程同步
- 2.2.线程的同步和协作_基本协作
- java中线程的同步:(互斥,协作)
- 线程协作
- 线程协作
- Python线程编程(三)同步队列
- [JAVA]线程同步队列 LinkedBlockingQueue ConcurrentLinkedQueue
- 关于线程同步与双队列性能
- 关于线程同步与双队列性能
- Java 线程同步,消息队列,数据库
- 线程同步方法之阻塞队列
- 进程间协作、同步
- hdu 3466(排序+背包)Proud Merchants
- [2015-07-14] python001
- 选择结构和循环结构程序设计
- Lowest Common Ancestor of a Binary Tree
- 使用github出了些问题?fatal: unable to access;Failed connect to github.com:8087;
- 同步队列协作线程
- 面向对象之异常处理
- Delete Node in a Linked List
- JavaScript正则表达式
- lua 首次编译
- [2015-07-15] python002
- 选项卡内容容器切换程序
- Android Studio移除的Module如何恢复
- Java SE 学习笔记(一)