模拟做饭系统(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()方法强制线程结束,不建议使用。

时间: 2024-12-22 01:56:40

模拟做饭系统(java+线程中的join方法)的相关文章

Java多线程中的join方法

新建一个Thread,代码如下: 1 package com.thread.test; 2 3 public class MyThread extends Thread { 4 private String name; 5 public MyThread(String name) { 6 this.name = name; 7 } 8 @Override 9 public void run() { 10 for (int i = 0; i < 100; i++) { 11 System.out.

java线程Thread的join方法。

1,方法的作用: 父线程等待子线程的执行. 如果是join或者join(0),即等待时长是0,父线程就会一直等到子线程执行结束, 如果是join(time),即等待时长是time数值,那父线程等待时长视情况而定: 第一种:子线程执行时长不需要time时长,那么父线程就可能不会等待到time时长,为什么是可能呢?是不是要考虑其他线程(不包括父线程,和子线程以外的线程),他也可能让父线程等待的(没有获取到cpu时间片等原因), 第二种:子线程执行时长超过time时长,那么父线程的等待时长,至少是ti

Python线程中的join方法

join 方法:阻塞线程 , 直到该线程执行完毕 因此  ,可以对join加一个超时操作 , join([timeout]),超过设置时间,就不再阻塞线程 jion加上还有一个后果就是, 子线程和主线程绑定在一起 , 直到子线程运行完毕,才开始执行子线程. 代码 有join: 在CODE上查看代码片派生到我的代码片 ?1234567 #-*- coding: UTF-8 -*-         import threading  from time import sleep     def fu

线程中的join方法

join方法的作用是同步线程. 1.不使用join方法:当设置多个线程时,在一般情况下(无守护线程,setDeamon=False),多个线程同时启动,主线程执行完,会等待其他子线程执行完,程序才会退出. def print_number(num): print("-----> %d" % num, time.ctime()) time.sleep(5) print("print_number ending......", time.ctime()) def

Java线程中的join使用实例

JDK中解释为 Waits for this thread to die. 等待本线程结束后,下一个线程才可以运行. 实例要求: 现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行 实现代码: package com.st.lesson02; public class Test01 { //1.现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行 public static void main(String[] args)

Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别

Java线程中sleep().wait()和notify()和notifyAll().suspend和resume().yield().join().interrupt()的用法和区别 从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield. 或者当前正在被服务的线程需要睡一会,醒来后继续被服务,这就是sleep. 

thread.join函数,java多线程中的join函数解析

join函数的作用,是让当前线程等待,直到调用join()的 线程结束或者等到一段时间,我们来看以下代码 1 package mian; 2 3 4 public class simpleplela { 5 static void threadMessage(String message) { 6 String threadName = 7 Thread.currentThread().getName(); 8 9 System.out.println(threadName+" "+m

在Java 线程中返回值的用法

http://icgemu.iteye.com/blog/467848 在Java 线程中返回值的用法 博客分类: Java Javathread 有时在执行线程中需要在线程中返回一个值:常规中我们会用Runnable接口和Thread类设置一个变量:在run()中改变变量的值,再用一个get方法取得该值,但是run何时完成是未知的:我们需要一定的机制来保证. 在在Java se5有个Callable接口:我们可以用该接口来完成该功能: 代码如: Java代码   package com.thr

Java线程中锁的问题

Java线程中锁的问题: 同步代码块的锁是自己定义的类:object obj = new object 同步方法的锁是this 静态同步方法的锁是类名.class