使用点餐的过程示例线程交互
2017-05-18 14:26
211 查看
好记性不如赖笔头…………
注意一点:在唤醒线程时,必须使用锁对象唤醒,否则,会报错。在进行wait状态时,锁并没有让出去。
这里主要讲述的是线程的交互
点餐的实体类:
做饭的类:
吃饭的类:
用户点餐的测试类:
执行结果:
注意一点:在唤醒线程时,必须使用锁对象唤醒,否则,会报错。在进行wait状态时,锁并没有让出去。
这里主要讲述的是线程的交互
点餐的实体类:
package com.Ckinghan.threadEach; /** * @author Ckinghan * @描述:线程交互,点餐实体类 */ public class Rice { //点的菜名 private String name; //点的菜是否已经做好了 private boolean isNo; public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isNo() { return isNo; } public void setNo(boolean isNo) { this.isNo = isNo; } }
做饭的类:
package com.Ckinghan.threadEach; /** * @author Ckinghan * @描述:线程交互 */ public class Cook implements Runnable { //点餐的内容 private Rice rice; //构造参数 public Cook(Rice rice) { this.rice = rice; } @Override public void run() { while (true) { //加锁 synchronized (rice) { //如果叫的餐已经有做好的 if(rice.isNo()){ try { //等待下一个叫餐菜单 rice.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else{ try { //休息1秒钟发个呆 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //做饭 System.out.println("正在做饭!"); //饭做好了,告诉服务员 rice.setNo(true); //叫醒一个线程去送饭去 rice.notify(); } } } } }
吃饭的类:
package com.Ckinghan.threadEach; /** * @author Ckinghan * @描述:线程交互 */ public class Eat implements Runnable { /** * 点餐对象 */ private Rice rice; /** * 构造参数必须输入点的餐 */ public Eat(Rice rice) { this.rice = rice; } /** * @描述: * @创建时间: */ @Override public void run() { /** * 一直接执行下去 */ while(true){ /** * 锁定rice对象 */ synchronized (rice) { //如果饭还没做好 if(!rice.isNo()){ try { //等待 rice.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else{ try { //休息1秒等待饭上桌,再去吃饭 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //吃饭 System.out.println("正在吃饭!"); //吃完了,设置为饭没有了 rice.setNo(false); //叫醒一个等待的线程起床去干活 rice.notify(); } } } } }
用户点餐的测试类:
package com.Ckinghan.threadEach; /** * @author Ckinghan * @描述:线程交互 */ public class Demo { public static void main(String[] args) { //客人点菜了 Rice rice = new Rice(); rice.setName("青椒炒蛋"); //当前的菜没有做 rice.setNo(false); //做饭行为 Cook cook = new Cook(rice); //吃饭行为 Eat eat = new Eat(rice); /** * 创建两个线程,一个去做饭,一个去吃饭 */ Thread thread1 = new Thread(eat); Thread thread2 = new Thread(cook); /** * 让两个线程去干活 */ thread1.start(); thread2.start(); } }
执行结果:
正在做饭! 正在吃饭! 正在做饭! 正在吃饭! 正在做饭! 正在吃饭! 正在做饭! 正在吃饭! 正在做饭!
相关文章推荐
- flex 与 java交互 的一个简单示例 (使用RemoteObject)
- (四)线程--使用线程回调方法(示例下载)
- android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版
- 开启线程CreatThread函数的使用,主线程与工作线程的交互
- Flex与后台交互的4种方法 URLLoader、HTTPService、WebService、RemoteObject使用示例
- 存储过程使用示例
- (四)线程--使用线程回调方法(示例下载)
- 一个使用boost::thread_specific_ptr线程本地存储的示例,value将不受其它线程影响
- AdoHelper使用MySQL存储过程示例
- android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版
- 使用回调和线程处理一个耗时响应过程
- [MSSQL]存储过程示例(拷贝数据表--游标使用--更新数据-日期函数的使用)
- 线程--使用线程回调方法(示例下载)
- 界面和线程交互之简单使用说明
- msSQL存储过程中使用 IF ELSE 的规范示例
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- VB.NET的示例使用 AddressOf 运算符来指定线程的启动函数(多线程)
- MySql 存储过程游标使用示例
- 使用数据库手工分页存储过程示例
- mssql使用出参的存储过程示例