模拟做饭系统(java+线程中的join方法)
(一)项目框架分析
妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭。
根据面向对象的思想,有两个对象,妈妈和儿子
主要有两个方法:
(一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+(没有调用jion方法)
(二)有线程控制(妈妈进程和儿子进程又先后影响)+(调用jion方法)
项目的结构图:

(二)没有进程控制mintak
Son.java主要是模拟儿子的行动,儿子买酱油的行动(与有进程控制的源程序相同)
代码如下:
public class Son implements Runnable {
public void run(){
System.out.println("儿子出门去买酱油");
System.out.println("儿子买东西来回需要五分钟");
//买酱油过程
try{
for(int i=1;i<=5;i++){
Thread.sleep(1000);
System.out.print(i+"分钟");
}
}catch (InterruptedException ie){
System.out.println("\n儿子买酱油回来了");
}
}
}
Mother.java主要是模拟妈妈的行为,
主要代码如下
package com.cjg.normal;
import com.cjg.mistak.Son;
public class Mother implements Runnable {
public void run(){
//输出相应的信息,即妈妈发现没有酱油,叫儿子去买酱油回来
System.out.println("妈妈准备煮饭");
System.out.println("妈妈发现酱油用完了");
System.out.println("妈妈叫儿子去买酱油");
Thread son =new Thread(new Son());
son.start();
System.out.println("妈妈等待儿子买酱油回来");
try{
//当两个线程合并成功后,妈妈线程的执行必须等儿子线程执行完毕之后
son.join();
}catch (InterruptedException ie){
//输出相应信息
System.err.println("发生异常!");
System.err.println("妈妈中断煮饭!");
System.exit(1);
}
//儿子买酱油回家,妈妈开始做饭
System.out.println("妈妈开始煮饭");
System.out.println("妈妈煮好饭了");
}
}
Cooking.java是测试妈妈和儿子的类是否实现了做饭
import com.cjg.mistak.Mother;
public class Cooking {
public static void main(String argv[]){
Thread mother = new Thread(new Mother());
}
}
(三)有进程控制的
主要是Mother.java类中的内容有不同,
Mother.java类的具体代码:
package com.cjg.normal;
import com.cjg.mistak.Son;
public class Mother implements Runnable {
public void run(){
//输出相应的信息,即妈妈发现没有酱油,叫儿子去买酱油回来
System.out.println("妈妈准备煮饭");
System.out.println("妈妈发现酱油用完了");
System.out.println("妈妈叫儿子去买酱油");
Thread son =new Thread(new Son());
son.start();
System.out.println("妈妈等待儿子买酱油回来");
try{
//当两个线程合并成功后,妈妈线程的执行必须等儿子线程执行完毕之后
son.join();
}catch (InterruptedException ie){
//输出相应信息
System.err.println("发生异常!");
System.err.println("妈妈中断煮饭!");
System.exit(1);
}
//儿子买酱油回家,妈妈开始做饭
System.out.println("妈妈开始煮饭");
System.out.println("妈妈煮好饭了");
}
}
(四)线程的状态
(4-1)基本状态
线程也有生命周期,在自己的生命周期会有5种状态,new(创建)、runnable(等待运行)、running(运行)、blocked(暂停)和dead(结束)。
它们的关系如图

当产生Thread类对象时,该对象就会处于new状态,调用start()方法后就会进入runnable状态。如果CPU调用该线程时,就会从runnable状态进入running状态,运行线程中run()方法中的代码,具体过程如下图:

(4-2)线程的暂停状态
对应线程对象,如果想实现让其暂时停止,但是恢复运行后又不产生一个新的线程对象时,就需要学习如何使线程处于暂停状态。我们可以通过一下4种方式来实现该功能:

1.sleep()方法
sleep这个单词的英文意思是睡觉,主要用来实现让thread对象睡觉,不过在睡觉时设置了闹钟,时间一到就会恢复运行,该方法的使用方法为:
thread.sleep(long millis)
millis表示的是睡眠时间,这个时间的单位是千分之一秒,如果想睡1s的话,则需要传入的是1000
当一个thread类对象睡醒之后,不是立刻进入running状态,而是先进入runnable状态。
2.yield()方法
当CPU正调用一个线程运行时,如果该线程睡眠一段时间后才被执行,就需要调用sleep()方法;如果该线程不想这时候运行,可以调用yield()方法。
对于sleep()方法,线程在指定的时间里肯定不会由running状态转换到runnable状态;
对于yield()方法,线程可能马上由running状态转换到runnable状态。
使用的基本方法为:
thread.yield()
3.join()方法
当处于runnable状态的线程为好几个线程时,如果线程1需要等待线程2完成某件事后,才能继续执行下去,这时就需要用到join()方法。
使用的基本格式如下:
Thread.join()
4.wait()方法和nofity()方法
wait()方法与join()方法非常类似,对于join()方法,线程1需要等待线程2完成某件事情后才能继续进行下去,线程2完成就表示该线程运行完毕自然死亡;而对于wait()方法,只有线程2调用nofity()方法来唤醒线程1,其才能执行。
(4-3)线程的结束状态
相要结束线程有两种方式:自然消亡和强制消亡。
自然消亡:是指一个线程从其的run()方法的结尾处返回,执行结束之后自然消亡。
强制消亡:是指用Thread类中的stop()方法强制线程结束,不建议使用。
模拟做饭系统(java+线程中的join方法)的更多相关文章
- Java多线程中的join()方法
一.join()方法介绍 join() 定义在Thread.java中.join()方法把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的join( ...
- 线程中的join方法,与synchronized和wait()和notify()的关系
什么时候要用join()方法? 1,join方法是Thread类中的方法,主线程执行完start()方法,线程就进入就绪状态,虚拟机最终会执行run方法进入运行状态.此时.主线程跳出start方法往下 ...
- java线程学习之join方法
join()方法表示一个线程要加入另一个线程,直到被加入的线程执行完毕. 这个概念不好理解的话看面这个例子 public class TestJoin { public static void mai ...
- 浅谈Java多线程中的join方法
先上代码 新建一个Thread,代码如下: package com.thread.test; public class MyThread extends Thread { private String ...
- Java多线程中的join方法
新建一个Thread,代码如下: package com.thread.test; public class MyThread extends Thread { private String name ...
- java多线程中关于join方法的使用
Thread的非静态方法join()让一个线程B"加入"到另外一个线程A的尾部.在A执行完毕之前,B不能工作.例如: Thread t = new MyThread ...
- 线程中的join方法
join方法的作用是同步线程. 1.不使用join方法:当设置多个线程时,在一般情况下(无守护线程,setDeamon=False),多个线程同时启动,主线程执行完,会等待其他子线程执行完,程序才会退 ...
- Java线程中的join使用实例
JDK中解释为 Waits for this thread to die. 等待本线程结束后,下一个线程才可以运行. 实例要求: 现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3 ...
- Java并发编程--多线程中的join方法详解
Java Thread中, join()方法主要是让调用该方法的thread在完成run方法里面的部分后, 再执行join()方法后面的代码 例如:定义一个People类,run方法是输出姓名年龄. ...
随机推荐
- 使用python爬取MedSci上的期刊信息
使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...
- 阿里CEO张勇公开信:把眼光从股市回到客户身上
8月25日消息,面对全球资本市场的剧烈波动,阿里巴巴集团CEO张勇今日发表致员工信,倡议全体阿里员工把眼光从股市回到客户身上,脚踏实地的服务帮助客户,为客户创造价值,继而为股东和自己创造价值. 张 ...
- mvn常用指令记录
maven工程版本号更新: -------------------------------------------------------------------------------------- ...
- Oracle 11gR2 RAC ohasd failed to start 解决方法
rcrCRS-4124: Oracle High Availability Services startup failed. CRS-4000: Command Start failed, or co ...
- HTML5 Canvas、内联 SVG、Canvas vs. SVG
canvas 元素用于在网页上绘制图形. 什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canv ...
- 管理维护Replica Sets
1.读写分离 有一些第三方的工具,提供了一些可以让数据库进行读写分离的工具.我们现在是否有一个疑问,从库要是能进行查询就更好了,这样可以分担主库的大量的查询请求. 1. 先向主库中插入一条测试数据 2 ...
- JAVA轻量级文件监控
原文地址:http://blog.csdn.net/three_man/article/details/31012903?utm_source=tuicool 介绍 本文主要介绍一种轻量级的文件监控方 ...
- 通过浏览器navigator判断浏览器版本或者手机类型&&判断微信访问
javascript 的navigator属性,不常用,但是用处也不少,主要用处是在做浏览器兼容的问题的时候,现在有的网站已经不兼容IE6,用户假如用IE6浏览网页的话,会提示浏览器升级等信息.或者判 ...
- Vue.js自定义指令的用法与实例
市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,以致于即便明白了怎么写,也不知道怎么用.本文不讲语法,就讲自定义指令的用法. 自定义指令是用来操作DOM的.尽管Vu ...
- CodeForces 429B
Working out Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Desc ...