java 厨师,顾客,订餐的多线程示例程序
来源:互联网 发布:英伟达显卡驱动优化器 编辑:程序博客网 时间:2024/04/30 01:14
厨师,顾客,订餐的多线程示例程序
1)wait方法要在一个循环中
public void waitForChef() throws InterruptedException { while (readyFlag) wait(); }
2)由于厨师线程有多个,顾客有多个,所以要用notifyAll方法,而不是notify,因为notify很容易就产生死锁
3)TimeUnit.MILLISECONDS.sleep(200); 用于降低程序的运行速度,用于示例
4)
while (!Thread.interrupted()) { <span style="font-family: Arial, Helvetica, sans-serif;">}</span>
用于检测异常,异常可能发生在sleep()方法中,也可能发生在wait方法中,也可能在while体中的其他部分,这时候下次执行while便会退出while循环,
由于
Thread.interrupted()
方法会清楚异常标识,所以最后
exec.shutdownNow();
执行时,有一部分线程的catch语句中的print语句并不会得到执行
5)条件检测和线程的主要任务执行都要放在synchronized块中
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;class Meal {private static int count=0; private final int orderNum=++count; public String toString() { return " Meal "+orderNum; } }class WaitPerson implements Runnable { private Restaurant restaurant; public WaitPerson( Restaurant restaurant) { this.restaurant=restaurant; } public void run() { try { while (!Thread.interrupted()) { synchronized(restaurant) { restaurant.waitForEating(); System.out.println("The WaitPerson "+Thread.currentThread().getId()+" has eaten " + restaurant.meal); restaurant.setReadyFlag(false); restaurant.notifyAll(); } } } catch(InterruptedException e) { System.out.print("Exiting via interrupt in WaitPerson in thread-->"+ Thread.currentThread().getId()); } System.out.print("Exiting in WaitPerson in thread-->"+ Thread.currentThread().getId()); }}class Chef implements Runnable { private Restaurant restaurant; public Chef( Restaurant restaurant) { this.restaurant=restaurant; } public void run() { try { while (!Thread.interrupted()) { synchronized(restaurant) { TimeUnit.MILLISECONDS.sleep(200); restaurant.waitForChef(); restaurant.meal=new Meal(); System.out.println("The Chef "+Thread.currentThread().getId()+" has made" + restaurant.meal); restaurant.setReadyFlag(true); restaurant.notifyAll(); } } } catch(InterruptedException e) { System.out.print("Exiting via interrupt in Chef in thread-->"+ Thread.currentThread().getId()); } System.out.print("Exiting in Chef in thread-->"+ Thread.currentThread().getId()); }}public class Restaurant { private boolean readyFlag=false; //true 做好了, false代表没做好 public Meal meal=null; public void setReadyFlag(boolean readyFlag) {this.readyFlag = readyFlag;}public void waitForChef() throws InterruptedException { while (readyFlag) wait(); } public void waitForEating() throws InterruptedException { while (readyFlag == false) wait(); } public static void main(String[] args) throws Exception { Restaurant restaurant=new Restaurant(); ExecutorService exec = Executors.newFixedThreadPool(20);for (int i = 0; i < 10; i++) {exec.execute(new Chef(restaurant));exec.execute(new WaitPerson(restaurant));}TimeUnit.SECONDS.sleep(10); // Run for a while...exec.shutdownNow(); // Interrupt all tasks }}
0 0
- java 厨师,顾客,订餐的多线程示例程序
- java多线程入门知识及示例程序
- 一个多线程示例程序的BUG修复
- 求网上订餐系统 java写的
- 基于java web的在线订餐系统
- delphi多线程程序示例
- delphi多线程程序示例
- 多线程程序示例
- Java的Container示例程序
- 订餐系统:订餐管理系统的一些故事
- java多线程下载的实现示例
- (java)多线程之CountdownLatch的简单示例
- JAVA项目:订餐系统步骤解析
- Java吃货联盟订餐系统
- 吃货联盟订餐系统 java
- java ssh 在线订餐系统
- java多线程示例
- java多线程示例
- git基本操作
- 机器视觉(Machine Vision)学习博客导引
- java设计模式——结构型之装饰模式
- 5.实现
- POJ1948 Triangular Pastures(01背包)
- java 厨师,顾客,订餐的多线程示例程序
- BestCoder Round #75 King's Cake 模拟&&优化 || gcd
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
- 计算机网络----- 协议层次
- 上楼梯(递归+记忆化)
- 【杂】零散的截图笔记
- HDU 5641 国王的手机 king's phone
- ireport使用图片制作复选框,并将图片设置相对路径放在项目中
- 剖析C++多态:用C实现简单多态