3-等待线程终止的join方法
等待线程终止的join方法
在项目实践中经常会遇到一个场景,就是需要等待某几件事完成之后才能继续往下执行,比如线程加载资源等等。
package com.heiye.learn1; public class JoinTest {
public static void main(String[] args) throws InterruptedException {
Thread threadOne=new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(1000); } catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("child threadOne over!");
}
}); Thread threadTwo=new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("child threadTwo over!");
}
}); //启动子线程
threadOne.start();
threadTwo.start();
System.out.println("wait all child thread over!"); //等待子线程执行完成,返回
threadOne.join();
threadTwo.join();
System.out.println("all child thread over!");
}
}

如上代码在主线程里面启动了两个线程,然后分别调用了它们的join方法,那么主线程首先会调用threadOne.join()执行完毕后返回,然后主线程调用threadTwo.join()方法后再次被阻塞,等待threadTwo执行完毕后返回。
另外,线程A调用线程B的join方法会阻塞,当其他线程调用了线程A的Interrupt()方法中断了A时,线程A会抛出InterruptedException异常而返回。如下:
package com.heiye.learn1; public class JoinTest2 {
public static void main(String[] args) {
Thread threadOne = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("threadOne begin run!");
for (; ; ) { }
}
}); //获取主线程
final Thread mainThread = Thread.currentThread(); //线程two
Thread threadTwo = new Thread(new Runnable() {
@Override
public void run() {
//休眠1秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} //中断主线程
mainThread.interrupt();
}
}); //启动线程one
threadOne.start();
//延迟1s启动线程two
threadTwo.start(); try {//等待线程one结束
threadOne.join();
} catch (InterruptedException e) {
//e.printStackTrace();
System.out.println("main thread: " + e);
}
}
}

如上代码在threadOne线程里陷入死循环,主线程调用threadOne.join()方法阻塞自己等待线程threadOne执行完毕,在threadTwo休眠1s后会调用主线程的inerrupt()方法设置主线程的中断标志,从结果上来看,主线程的threadOne.join()会抛出InterruptedException异常,这里另外注意的是,在threadTwo里面调用的是是主线程的interupt()方法,而不是线程threadOne的。
3-等待线程终止的join方法的更多相关文章
- java线程学习之join方法
join()方法表示一个线程要加入另一个线程,直到被加入的线程执行完毕. 这个概念不好理解的话看面这个例子 public class TestJoin { public static void mai ...
- 线程中的join方法,与synchronized和wait()和notify()的关系
什么时候要用join()方法? 1,join方法是Thread类中的方法,主线程执行完start()方法,线程就进入就绪状态,虚拟机最终会执行run方法进入运行状态.此时.主线程跳出start方法往下 ...
- 线程中的join方法
join方法的作用是同步线程. 1.不使用join方法:当设置多个线程时,在一般情况下(无守护线程,setDeamon=False),多个线程同时启动,主线程执行完,会等待其他子线程执行完,程序才会退 ...
- JAVA笔记13__创建线程/线程休眠/等待线程终止/线程中断/守护线程
/** * 线程:是进程的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个进程(单线程程序) * 多线程两种实现方法:1.继承Thread类 2.实现Runnable ...
- 模拟做饭系统(java+线程中的join方法)
(一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+ ...
- 线程入门之join方法
package com.thread; /** * <join:将某线程加入进来,相当于方法调用,也叫合并某个线程> * <功能详细描述> * * @author 95Yang ...
- 多线程---其他方法 停止线程、守护线程、join方法
第三方停止线程: 原来是stop(),因为该方法有些问题,所以被interrupt()方法取代,它的用途跟机制是 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到 ...
- Python之路(第四十二篇)线程相关的其他方法、join()、Thread类的start()和run()方法的区别、守护线程
一.线程相关的其他方法 Thread实例对象的方法 # isAlive(): 返回线程是否活动的. # getName(): 返回线程名. # setName(): 设置线程名. threadin ...
- 线程状态以及sleep yield wait join方法
前言 在日常的开发过程中,我们通过会使用Thread.sleep模拟一个耗时的任务执行过程. 在深入理解这四个方法之前,首先对线程的状态进行理解阐述. 线程概念 线程是操作系统执行任务的基本单位,处理 ...
随机推荐
- QT怎样插入图片
工具/原料 QT designer 方法/步骤 1 首先创建一个Manwindow窗口 拖一个label到窗口上 把文字去掉,然后把label放大 找到stylesheet一栏 ...
- C程序设计学习笔记(完结)
时间:2015-4-16 09:17 不求甚解,每有会意,欣然忘食.学习的过程是痛苦的 第1章 程序设计和C语言 第2章 算法--程序的灵魂 -算法的五个特点 ...
- Python代码阅读(第1篇):列表映射后的平均值
本篇阅读的代码实现了将列表进行映射,并求取映射后的平均值. 本篇阅读的代码片段来自于30-seconds-of-python. average_by def average_by(lst, fn=la ...
- indexedDB数据库完整创建流程
1.打开数据库 使用 IndexedDB 的第一步是打开数据库,使用indexedDB.open()方法 var request = window.indexedDB.open(databaseNam ...
- 最新 .NET Core 中 WebSocket的使用 在Asp.Net MVC 中 WebSocket的使用 .NET Core 中 SignalR的使用
ASP.NET MVC 中使用WebSocket 笔记 1.采用控制器的方法 这个只写建立链接的方法的核心方法 1.1 踩坑 网上都是直接 传个异步方法 直接接受链接 自己尝试了好多次链接是打开的,到 ...
- 【odoo】【知识杂谈】单一实例多库模式下定时任务的问题分析
欢迎转载,但需标注出处,谢谢! 背景: 有客户反应有个别模块下的定时任务没有正常执行,是否是新装的模块哪些有问题?排查后发现,客户是在一台服务器上跑着一个odoo容器,对应多个数据库.个别库的定时任务 ...
- You-Get开源在线下载神器,搭配python更加丝滑(文中案例演示)
大家好,我是辰哥 今天给大家介绍一个号称可以下载全网视频.音频.图像的开源库 --you-get you-get 这里说全网可能一点夸张,但如果实际上去使用you-get下载媒体文件(视频.音频.图像 ...
- Linux 内核:匠心独运之无锁环形队列kfifo
Linux 内核:匠心独运之无锁环形队列 Kernel version Linux 2.6.12 Author Toney Email vip_13031075266@163.com Da ...
- GIT:修改上一次提交的注释信息(git commit --amend)
git commit -m 注释信息 如果这时候注释信息输入错误,就可以输入以下指令更改 git commit --amend 键入" i "进入编辑模式 修改后键入ESC,:wq ...
- 数据导出生成Excel附件使用POI的HSSFWorkbook对象
比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel.Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组 ...