Thinking in Java学习笔记 吐司的制作和消费过程
2015-02-25 15:39
453 查看
多个LinkedBlockingQueue队列,每个流程都有一个或两个队列,从上一个流程的队列中获取吐司,本流程处理完毕之后放入下一流程的队列
每个流程通过LinkedBlockingQueue.take()方法取队列中的任务时,如果上一个流程没有完成任务,队列是空的,则会堵塞在take()方法这里
源码如下:
TostOMatic.java
每个流程通过LinkedBlockingQueue.take()方法取队列中的任务时,如果上一个流程没有完成任务,队列是空的,则会堵塞在take()方法这里
源码如下:
public E take() throws InterruptedException { E x; int c = -1; final AtomicInteger count = this.count; final ReentrantLock takeLock = this.takeLock; takeLock.lockInterruptibly(); try { while (count.get() == 0) { notEmpty.await(); } x = dequeue(); c = count.getAndDecrement(); if (c > 1) notEmpty.signal(); } finally { takeLock.unlock(); } if (c == capacity) signalNotFull(); return x; }
TostOMatic.java
package com.test.concurrent; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; /* * * 土司生产者与消费者 * 生产者包括toast、butter和jam三个流程 */ 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; } @Override public void run() { // TODO Auto-generated method stub try { while(!Thread.interrupted()){ TimeUnit.MILLISECONDS.sleep(100+rand.nextInt(500)); Toast t=new Toast(count++); System.out.print(t+" "); toastQueue.put(t); } } catch (InterruptedException e) { // TODO Auto-generated catch block System.out.println("Toaster InterruptedException"); e.printStackTrace(); } System.out.println("-----------Toaset off----------------------"); } } class Butterer implements Runnable{ private ToastQueue dryQueue, butteredQueue; public Butterer(ToastQueue dry, ToastQueue buttered){ dryQueue=dry; butteredQueue=buttered; } @Override public void run() { // TODO Auto-generated method stub try { while(!Thread.interrupted()){ Toast t=dryQueue.take(); t.butter(); System.out.print(t+" "); butteredQueue.put(t); } } catch (InterruptedException e) { // TODO Auto-generated catch block System.out.println("butterer InterruptedException"); e.printStackTrace(); } System.out.println("----------butter off------------------------------"); } } class Jammer implements Runnable{ private ToastQueue butteredQueue,finishedQueue; public Jammer(ToastQueue buttered,ToastQueue finished){ butteredQueue=buttered; finishedQueue=finished; } @Override public void run() { // TODO Auto-generated method stub try { while(!Thread.interrupted()){ Toast t=butteredQueue.take(); t.jam(); System.out.print(t+" "); finishedQueue.put(t); } } catch (InterruptedException e) { // TODO Auto-generated catch block System.out.println("Jammer InterruptedException"); e.printStackTrace(); } System.out.println("------------jam off---------------------"); } } class Eater implements Runnable{ private ToastQueue finishedQueue; private int counter=0; public Eater(ToastQueue finished){ finishedQueue=finished; } @Override public void run() { // TODO Auto-generated method stub try { while(!Thread.interrupted()){ Toast t=finishedQueue.take(); if(t.getId()!=counter++||t.getStatus()!=Toast.Status.JAMMED){ System.out.println(">>>>>>Error:"+t); }else{ System.out.println(" Chomp!! "+t); } } } catch (InterruptedException e) { // TODO Auto-generated catch block System.out.println("Eater InterruptedException"); e.printStackTrace(); } System.out.println("-----------------Eater off-----------------"); } } public class TostOMatic { public static void main(String [] args) throws InterruptedException{ 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(); } }
相关文章推荐
- Java学习笔记 制作图表过程(Eclipse+JFreeChart)
- 我的Thinking in Java学习笔记(十)
- 【学习笔记】Thinking in java (第三版)第六章 Reusing Classes(复用类)
- thinking in java 学习笔记之Initialization and Cleanup
- 我的Thinking in Java学习笔记(六)(zt)
- 我的Thinking in Java学习笔记(四) (zt)
- Thinking In Java学习笔记
- 我的Thinking in Java学习笔记(七) (zt)
- 我的Thinking in Java学习笔记(四)
- 我的Thinking in Java学习笔记(三)
- 我的Thinking in Java 3rd 的学习笔记
- 【学习笔记】Thinking in java (第三版)第四章 初始化和清除(Initialization & Cleanup)
- [学习笔记]Thinking in Java (the 2nd edition) Study Note (1)
- 我的Thinking in Java学习笔记(五)
- 我的Thinking in Java学习笔记(八)
- 【学习笔记】Thinking in java (第三版)第五章 隐藏实现(Hiding the implementation)
- [学习笔记]Thinking in Java (the 2nd edition) Study Note (1)
- [学习笔记]Thinking in Java (the 2nd edition) Study Note (3)
- Thinking in Java学习笔记(2)(zt)
- thinking in java 学习笔记之Composition vs Inheritance