`
santiagow
  • 浏览: 5026 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

阻塞队列实例-《Java编程思想》并发习题29

阅读更多
花了一个半晚上,终于独立搞定这道阻塞队列的习题,虽然对高手可能是小kiss,但对于我这种新手还是蛮开心的。

我准备把《Java编程思想》学习完之后就去换一份Java开发类的工作,本人机械专业,有高手路过还请指点!

处理并发程序最关键的是确定互斥量并良好的处理各线程之间的资源共享。
-----------------------------------------------------------------
package concurrency;
/*Exercise 29:   (8) Modify ToastOMatic.java to create peanut butter and jelly on toast
sandwiches using two separate assembly lines (one for peanut butter, the second for jelly,
then merging the two lines).  */
import java.util.concurrent.*;
import java.util.*;
import static net.mindview.util.Print.*;

class ToastQue extends LinkedBlockingQueue<Toast29> {}
class SandwichQue extends LinkedBlockingQueue<Sandwich> {}
//define Toast29;
class Toast29 {
  public enum Status { DRY, PEANUT, JELLY}
  private Status status = Status.DRY;
  private final int id;
  public Toast29(int idn) { id = idn; }
  public void peanut() { status = Status.PEANUT; }
  public void jelly(){status=Status.JELLY;}
  public Status getStatus() { return status; }
  public int getId() { return id; }
  public String toString() {
    return "Toast " + id + ": " + status;
  }
}


class Toaster29 implements Runnable {
  private ToastQue toastQue;
  private int count = 0;
  private Random rand = new Random(47);
  public Toaster29(ToastQue tq) { toastQue = tq; }
  public void run() {
    try {
      while(!Thread.interrupted()) {
        TimeUnit.MILLISECONDS.sleep(
          100 + rand.nextInt(500));
        // Make toast
        Toast29 t = new Toast29(count++);
        print(t);
        // Insert into queue
        toastQue.put(t);
      }
    } catch(InterruptedException e) {
      print("Toaster interrupted");
    }
    print("Toaster off");
  }
}

//DiQue用于分配资源;
class DiQue implements Runnable{
  private ToastQue dryQue,peanutQue,jellyQue;
  DiQue(ToastQue dry,ToastQue peanut,ToastQue jelly){
    dryQue=dry;peanutQue=peanut;jellyQue=jelly;
  }
  public void run(){
    try {
      while(!Thread.interrupted()){
        Toast29 t=dryQue.take();
        if(t.getId()%2==0) peanutQue.put(t);
        else jellyQue.put(t);
      }
    } catch (InterruptedException e) {
      print("Divider queue interrupt");
    }
  }
}

class Peanuter implements Runnable {
  private ToastQue proPeanutQue,peanutedQue;
  public Peanuter(ToastQue proPeanut,ToastQue peanuted) {
    proPeanutQue=proPeanut;
    peanutedQue=peanuted;
  }
  public void run() {
    try {
      while(!Thread.interrupted()) {
        // Blocks until next piece of toast is available:
        Toast29 t = proPeanutQue.take();
        t.peanut();
        print(t);
        peanutedQue.put(t);
      }
    } catch(InterruptedException e) {
      print("Peanuter interrupted");
    }
    print("Peanuter off");
  }
}
class Jellyer implements Runnable {
  private ToastQue proJellyQue,jellyedQue;
  public Jellyer(ToastQue proJelly, ToastQue jellyed) {
    proJellyQue = proJelly;
    jellyedQue=jellyed;
  }
  public void run() {
    try {
      while(!Thread.interrupted()) {
        // Blocks until next piece of toast is available:
        Toast29 t = proJellyQue.take();
        t.jelly();
        print(t);
        jellyedQue.put(t);
      }
    } catch(InterruptedException e) {
      print("Jellyer interrupted");
    }
    print("Jellyer off");
  }
}

//define Sandwich;
class Sandwich{
  private static int count;
  private final int id=count++;
  private Toast29[] toast=new Toast29[2];
  Sandwich(Toast29 jellyed,Toast29 peanuted){
    toast[0]=jellyed;toast[1]=peanuted;
  }
  public int getId(){
    return id;
  }
 
  public String toString(){
    return "Sandwich: "+id+", "+toast[0]+", "+toast[1];
  }
  public Toast29.Status getStatus0() {
    return toast[0].getStatus();
  }
  public Toast29.Status getStatus1() {
    return toast[1].getStatus();
  }
}

class Sandwicher implements Runnable{
  private ToastQue jellyedQue, peanutedQue;
  private SandwichQue sandwichQue;
  Sandwicher(ToastQue jellyed,ToastQue peanuted,SandwichQue sandwich){
    jellyedQue=jellyed;
    peanutedQue=peanuted;
    sandwichQue=sandwich;
  }
  public void run(){
    try {
      while(!Thread.interrupted()){
        Toast29 jellyed=jellyedQue.take();
        Toast29 peanuted=peanutedQue.take();
        Sandwich s=new Sandwich(jellyed,peanuted);
        print(s);
        sandwichQue.put(s);
      }
    } catch (InterruptedException e) {
      print("Sandwicher interrupted");
    }
  }
}
// Consume the sandwich:
class SandEater implements Runnable {
  private SandwichQue sandwichQue;
  private int counter = 0;
  public SandEater(SandwichQue sand) {
     sandwichQue= sand;
  }
  public void run() {
    try {
      while(!Thread.interrupted()) {
        // Blocks until next piece of toast is available:
        Sandwich s = sandwichQue.take();
        if(s.getId() != counter++ ||
          s.getStatus0() == Toast29.Status.PEANUT||
          s.getStatus1() == Toast29.Status.JELLY) {
          print(">>>> Error: " + s);
          System.exit(1);
        } else
          print("Chomp! " + s);
      }
    } catch(InterruptedException e) {
      print("Eater interrupted");
    }
    print("Eater off");
  }
}

public class ToastOMatic29 {
  public static void main(String[] args) throws Exception {
    ToastQue  dryQue = new ToastQue(),
              proPeanutQue = new ToastQue(),
              proJellyQue=new ToastQue(),
              peanutedQue = new ToastQue(),
              jellyedQue=new ToastQue();
    SandwichQue sandwichQue = new SandwichQue();
    ExecutorService exec = Executors.newCachedThreadPool();
    exec.execute(new Toaster29(dryQue));
    exec.execute(new DiQue(dryQue, proPeanutQue, proJellyQue));
    exec.execute(new Peanuter(proPeanutQue,peanutedQue));
    exec.execute(new Jellyer(proJellyQue,jellyedQue));
    exec.execute(new Sandwicher(jellyedQue,peanutedQue,sandwichQue));
    exec.execute(new SandEater(sandwichQue));
    TimeUnit.SECONDS.sleep(5);
    print("shutdown Now!");
    exec.shutdownNow();
  }
}
//output:~
/*Toast 0: DRY
Toast 0: PEANUT
Toast 1: DRY
Toast 1: JELLY
Sandwich: 0, Toast 1: JELLY, Toast 0: PEANUT
Chomp! Sandwich: 0, Toast 1: JELLY, Toast 0: PEANUT
Toast 2: DRY
Toast 2: PEANUT
Toast 3: DRY
Toast 3: JELLY
Sandwich: 1, Toast 3: JELLY, Toast 2: PEANUT
Chomp! Sandwich: 1, Toast 3: JELLY, Toast 2: PEANUT
Toast 4: DRY
Toast 4: PEANUT
Toast 5: DRY
Toast 5: JELLY
Sandwich: 2, Toast 5: JELLY, Toast 4: PEANUT
Chomp! Sandwich: 2, Toast 5: JELLY, Toast 4: PEANUT
Toast 6: DRY
Toast 6: PEANUT
Toast 7: DRY
Toast 7: JELLY
Sandwich: 3, Toast 7: JELLY, Toast 6: PEANUT
Chomp! Sandwich: 3, Toast 7: JELLY, Toast 6: PEANUT
Toast 8: DRY
Toast 8: PEANUT
Toast 9: DRY
Toast 9: JELLY
Sandwich: 4, Toast 9: JELLY, Toast 8: PEANUT
Chomp! Sandwich: 4, Toast 9: JELLY, Toast 8: PEANUT
Toast 10: DRY
Toast 10: PEANUT
Toast 11: DRY
Toast 11: JELLY
Sandwich: 5, Toast 11: JELLY, Toast 10: PEANUT
Chomp! Sandwich: 5, Toast 11: JELLY, Toast 10: PEANUT
Toast 12: DRY
Toast 12: PEANUT
Toast 13: DRY
Toast 13: JELLY
Sandwich: 6, Toast 13: JELLY, Toast 12: PEANUT
Chomp! Sandwich: 6, Toast 13: JELLY, Toast 12: PEANUT
Toast 14: DRY
Toast 14: PEANUT
shutdown Now!
Eater interrupted
Eater off
Jellyer interrupted
Jellyer off
Peanuter interrupted
Peanuter off
Divider queue interrupt
Sandwicher interrupted
Toaster interrupted
Toaster off
*/
0
2
分享到:
评论
1 楼 yeshaoting 2011-03-03  
支持一下,我也在断断续续的看Java编程思想.

相关推荐

    Java并发编程进阶练习代码

    本练习集专注于提升你在Java并发编程中的技巧,通过一系列逐步进阶的代码实例,帮助你掌握从基础到高级的并发概念。 首先,我们从“线程安全”开始。线程安全是指在多线程环境下,一个类或方法能够正确地处理并发...

    JAVA编程思想习题及答案

    《JAVA编程思想习题及答案》是一份涵盖了Java编程核心概念和实践的资源,旨在帮助学习者深化对Java的理解并提升编程技能。这份资料可能包括了各种习题、解答以及编程实例,覆盖了从基础语法到高级特性的广泛内容。 ...

    JAVA高质量并发详解,多线程并发深入讲解

    - **练习和思考题:** 旨在加深读者对并发编程的理解,并鼓励读者通过动手实践来提升编程能力。 #### 五、具体章节知识点 - **第1章:Java并发基础组件** 介绍`java.util.concurrent`包中的关键组件,如`...

    JAVA编程语言和数据结构第十一版 进阶版 编程答案

    在深入探讨Java编程语言与数据结构的第十一版(进阶版)的编程答案之前,首先需要理解这两个核心概念:Java编程语言和数据结构。Java是一种面向对象的、跨平台的编程语言,由Sun Microsystems(现已被Oracle收购)在...

    黑马Java八股文面试题视频教程,Java面试八股文宝典(含阿里、腾迅大厂java面试真题,java数据结构,java并发

    1. **Java基础**:这是所有Java程序员的基础,包括但不限于语法、面向对象编程(类、对象、继承、多态)、异常处理、集合框架(ArrayList、LinkedList、HashMap、HashSet等)、IO流和NIO(非阻塞I/O)等。...

    Java软件开发实战 Java基础与案例开发详解 14-8 练习题 共6页.pdf

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年推出。它旨在简化编程,并支持跨平台的兼容性。Java具有简单性、面向对象性、健壮性、安全性、平台独立性等特点。 #### 1.2 认识Java语言 ...

    java生产者消费者模型

    Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...

    操作系统练习题(操作系统练习题)

    本压缩包中的“操作系统练习题”旨在帮助学习者深入理解和掌握操作系统的核心概念、原理和机制。以下是根据这些练习题可能涉及的一些关键知识点的详细解析: 1. **进程管理**:在操作系统中,进程是程序的动态执行...

    Java后端面试题大纲(涵盖了百分之九十的考点).pdf

    ### Java后端面试题知识点详解 #### Java基础 1. **Java面向对象特性** - 面向对象编程(OOP)是Java的核心概念之一,它主要包括四个特性:封装、继承、多态和抽象。 - **封装**:将数据和操作数据的方法封装在一...

    最新Job_超级面试题

    - NIO(New Input/Output)在Java 1.4引入,提供了非阻塞I/O和选择器(Selector)等功能,提高了高并发I/O应用的性能。 10.设计模式: 23种经典设计模式分为创建型、结构型和行为型三大类,例如工厂模式、单例...

    100个C#编程练习的例子

    "100个C#编程练习的例子"这个资源提供了丰富的实例,涵盖了C#中的多种核心概念和技术,帮助初学者和进阶者巩固并提升技能。以下是对这些例子的一些详细解读: 1. **基础语法**:C#的基础包括变量、数据类型、运算符...

    操作系统练习题21

    在本题中,涉及的知识点主要围绕操作系统中的进程管理、同步机制、原语操作以及临界区的概念。 1. **进程控制块(PCB)**:PCB是操作系统用来记录和控制进程状态的数据结构,包含进程的状态、优先级、资源分配情况...

    UNIX环境高级编程_第2版.part2

    UNIX环境高级编程_第2版 ----------------------------------------------------------- 共两个压缩包( UNIX环境高级编程_第2版.part1 UNIX环境高级编程_第2版.part1 ) ------------------------------------------...

    UNIX环境高级编程_第2版.part1

    UNIX环境高级编程_第2版 ----------------------------------------------------------- 共两个压缩包( UNIX环境高级编程_第2版.part1 UNIX环境高级编程_第2版.part1 ) ------------------------------------------...

    UNIX环境高级编程部分

    - **进程和进程ID**:每个运行中的程序实例都是一个进程,每个进程都有唯一的进程ID。 - **进程控制**:涉及进程创建、终止等操作的系统调用。 - **ANSI C**:标准C语言定义了一系列特性。 - **函数原型**:声明...

    操作系统 课件

    操作系统是计算机科学的基础课程之一,它管理并控制计算机硬件与软件资源,为用户提供方便、高效的服务。...此外,课件中的PPT可能会包含案例分析、实例演示和习题,以帮助我们更好地理解和应用所学知识。

    UNIX高级环境编程

    - **阻塞 I/O 与非阻塞 I/O**:对比了阻塞I/O和非阻塞I/O的特点,以及如何选择合适的模式。 - **异步 I/O**:介绍了异步I/O的基本概念及其在高并发场景下的优势。 #### 11. 应用示例 - **数据库函数库创建**:通过...

    Java核心

    Java核心是Java编程语言的基础部分,它包含了Java语言的核心特性、...JavaCore-master这个项目可能包含了以上这些知识点的实例代码、练习题或者讲解文档,通过深入研究,可以加深对Java核心概念的理解,提升编程技能。

    multithreading-masterclass-resources

    "multithreading-masterclass-resources"很可能是一个关于Java多线程深入学习的资源集合,可能包括教程、代码示例、练习题等。下面将详细探讨Java多线程的相关知识点。 1. **线程定义**: - 线程是操作系统分配CPU...

Global site tag (gtag.js) - Google Analytics