现实生活中,有些工作是需要团队中成员依次完成的,这就涉及到了一个顺序问题。现在有T1、T2、T3三个工人,如何保证T2在T1执行完后执行,T3在T2执行完后执行?
问题分析:首先问题中有三个实体,T1、T2、T3, 因为是多线程编程,所以都要设计成线程类。关键是怎么保证线程能依次执行完呢?
Java实现过程如下:
public class T1 implements Runnable{ @Override public void run() { try { System.out.println("T1开始工作....."); Thread.sleep(RandomUtils.nextInt(300)); System.out.println("T1结束工作>>>>>"); } catch (InterruptedException e) { e.printStackTrace(); } } }
package thread.join.demo1; import org.apache.commons.lang.math.RandomUtils; public class T2 implements Runnable{ @Override public void run() { try{ System.out.println("T2开始工作....."); Thread.sleep(RandomUtils.nextInt(300)); System.out.println("T2结束工作>>>>>"); } catch (InterruptedException e) { e.printStackTrace(); } } }
public class T3 implements Runnable{ @Override public void run() { try{ System.out.println("T3开始工作....."); Thread.sleep(RandomUtils.nextInt(300)); System.out.println("T3结束工作>>>>>"); } catch (InterruptedException e) { e.printStackTrace(); } } }
public class Main { public static void main(String[] args){ Thread t1 = new Thread(new T1()); Thread t2 = new Thread(new T2()); Thread t3 = new Thread(new T3()); t1.start(); t2.start(); t3.start(); System.out.println("T1、T2、T3依次工作结束."); } }
运行结果:
T1开始工作.....
T2开始工作.....
T3开始工作.....
T1、T2、T3依次工作结束.
T3结束工作>>>>>
T2结束工作>>>>>
T1结束工作>>>>>
说明:从结果来看,T1、T2、T3并没有依次执行。查看JDK文档,java.lang.Thread 类有三个join()方法,其解释为:等待该线程终止。试用它来解决该问题……
Main.java修改如下:
public class Main { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new T1()); Thread t2 = new Thread(new T2()); Thread t3 = new Thread(new T3()); t1.start(); t1.join(); t2.start(); t2.join(); t3.start(); t3.join(); System.out.println("T1、T2、T3依次工作结束."); } }
运行结果:
T1开始工作.....
T1结束工作>>>>>
T2开始工作.....
T2结束工作>>>>>
T3开始工作.....
T3结束工作>>>>>
T1、T2、T3依次工作结束.
哈,解决了!
查看jdk源码,其中join方法代码片断如下:
/** * Waits at most <code>millis</code> milliseconds for this thread to * die. A timeout of <code>0</code> means to wait forever. * * @param millis the time to wait in milliseconds. * @exception InterruptedException if any thread has interrupted * the current thread. The <i>interrupted status</i> of the * current thread is cleared when this exception is thrown. */ public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }
单纯从代码上看:如果线程被生成了,但还未被起动,isAlive()将返回false,调用它的join()方法是没有作用的,将直接继续向下执行。在Main.java类中,t1.join()是判断t1线程的状态,如果t1的isActive()方法返回false,在 t1.join(),这一点就不用阻塞了,可以继续向下进行了。从源码里看,wait方法中有参数,也就是不用唤醒谁,只是不再执行wait,向下继续执行而已。在join()方法中,对于isAlive()和wait()方法的作用对象是个比较让人困惑的问题:
isAlive()方法的签名是:public final native boolean isAlive(),也就是说isAlive()是判断当前线程的状态,也就是t1的状态。
相关推荐
join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法
分而治之,ForkJoin,多线程编程
本压缩包,总共包含两个文档,JAVA多线程编程详解-详细操作例子和 Java多线 程编程总结 例如,runnable、thread、stop()、 suspend、yield、setPriority()、getPriority()、synchronized、wait()、join、线程池同步...
c++11多线程库的使用,主要介绍了thread类中的构造函数 join函数和detach函数的使用方式
多线程:在同一个时间做多件事 守护线程:如果在程序中将子线程设置为守护线程,则该子线程会在主线程结束时自动退出,设置方式为thread.setDaemon(True),要在thread.start()之前设置,默认是false的,也就是主线程...
Java实验指导书_多线程 《Java语言程序设计基础教程》 上机实验指导手册 异常处理 【目的】 ①线程的创建和运行 ②Thread类的sleep、join等方法的使用 ③线程同步
所以,互斥锁实质上是操作系统提供的一把“建议锁”(又称“协同锁”),建议程序中有多线程访问共享资源的时候使用该机制。但,并没有强制限定。 因此,即使有了mutex,如果有线程不按规则来访问数据,依然会造成...
第3章 多线程 《Python基础实训教程》第3章-多线程全文共23页,当前为第1页。... 3.2.1 Thread方法 Python实现线程创建是利用threading模块完成,开展多线程编程需要提前导入该模块,如: import threading 利用
│ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、...
主要介绍了Python多线程编程(三):threading.Thread类的重要函数和方法,本文讲解了线程名称、join方法、setDaemon方法等内容,需要的朋友可以参考下
创建线程 格式如下 复制代码 代码如下: threading.Thread(group=None, target=None, name=None, args=(), kwargs={}) 这个构造器必须用关键字传参调用 ...join(timeout=None) 程序挂起,直到线程结束;如果给了 timeout
基于linux的多线程编程,包括thread_create thread_join thread_string等
常见的多线程API和用法 pthread_self函数 pthread_create函数 pthread_exit函数 pthread_join函数 pthread_detach函数 pthread_equal函数
所以,多线程环境中,应尽量少用,或者不使用exit函数,取而代之使用pthread_exit函数,将单个线程退出。任何线程里exit导致进程退出,其他线程未工作结束,主控线程退出时不能return或exit。 另注意,pthread_exit...
本书全面解析了Java并发编程的核心概念、原理和实践,帮助读者深入理解多线程并发编程的精髓,提升编程能力和系统性能。 书中首先介绍了并发编程的基础知识,包括线程的基本概念、线程的生命周期、线程安全等问题。...
3.1 线程安全 多线程编程时,由于系统对线程的调度具有一定的随机性,所以,使用多个线程操作同一个数据时,容易出现线程安全问题。 当多个线程访问同一个资源时,如果控制不好,也会造成数据的不正确性。 以银行取...
│ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、...
报 告 课程名称: 线程控制实验 专业班级: 学 号: 姓 名: 报告日期: 2013年12月03日 计算机科学与技术学院 线程控制实验 一、目的和要求 通过本实验掌握在 Linux操作系统中遵循 Posix线程标准接口进行多线程程序...
我们在写linux的服务的时候,经常会用到linux的多线程技术以提高程序性能 多线程的一些小知识: 一个应用程序可以启动若干个线程。 线程(Lightweight Process,LWP),是程序执行的最小单元。 一般一个最简单的...
如果你是一名Java开发人员,并且想进一步掌握并发编程和多线程技术,并挖掘Java 7并发的新特性,那么本书是你的合适之选。 《Java 7并发编程实战手册》 第1章 线程管理 1 1.1 简介 1 1.2 线程的创建和运行...