java 多线程 Thread.join子线程结束父线程再运行;join(long):等待超时毫秒数
Join的使用
目的:当子线程运行结束后,父线程才能再继续运行
/**
* @ClassName ThreadJoinExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/24.
*/
public class ThreadJoinExample {
public static void main(String[] args) throws InterruptedException {
Runnable r = new Runnable() {
@Override
public void run() {
String tName = Thread.currentThread().getName();
try {
System.out.println(tName + "开始运行");
Thread.sleep(4000);
System.out.println(tName +"运行结束!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread thread = new Thread(r,"子任务1");
Thread thread2 = new Thread(r,"子任务2");
thread.start();
thread2.start();
thread.join(); //子线程阻塞主线程,待子线程运行结束
thread2.join(); //子线程阻塞主线程,待子线程运行结束
Thread.sleep(1000);
System.out.println("主线程运行结束!");
}
}

不能interrupt中断一个有join()子线程的父线程
/**
* @ClassName ThreadInterruptJoinThread
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/24.
*/
public class ThreadInterruptJoinThread {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread("parent"){
@Override
public void run() {
System.out.println(getName() + "开始运行");
Thread thread1 = new Thread("child"){
@Override
public void run() {
System.out.println(getName() + "开始运行");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + "运行结束");
}
};
thread1.start();
//thread1.join();
try {
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + "运行结束");
}
};
thread.start();
Thread.sleep(1000);
thread.interrupt();
thread.join();
System.out.println("主线程运行结束");
}
}

如上代码执行结果:join的child子线程还没结束,父线程就被interrupt中断,会导致父线程异常,且不再等待子线程child运行结束。
join(long):等待指定时间不结束就不等待了
/**
* @ClassName ThreadJoinTime
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/24.
*/
public class ThreadJoinTime {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread("child"){
@Override
public void run() {
System.out.println("子线程开始运行");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("子线程运行结束");
}
};
thread.start();
thread.join(1000);
System.out.println("主线程代码运行结束");
}
}
java 多线程 Thread.join子线程结束父线程再运行;join(long):等待超时毫秒数的更多相关文章
- Java 多线程基础(十)interrupt()和线程终止方式
Java 多线程基础(十)interrupt()和线程终止方式 一.interrupt() 介绍 interrupt() 定义在 Thread 类中,作用是中断本线程. 本线程中断自己是被允许的:其它 ...
- join当前线程等待指定的线程结束后才能继续运行
模拟一个QQ游戏大厅斗地主 /** sleep(休眠.睡眠) join当前线程等待指定的线程结束后才能继续运行 */ class Player extends Thread{ private Stri ...
- “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java多线程Thread.yield(),thread.join(), Thread.sleep(200),Object.wait(),Object.notify(),Object.notifyAll()的区别
Thread.yield(),在某个线程里调用Thread.yield(),会使这个线程由正在运行的running状态转变为等待cpu时间片的runable状态.join()是Thread类的一个非s ...
- Java多线程Thread
转自:http://www.cnblogs.com/lwbqqyumidi/p/3804883.html Java总结篇系列:Java多线程(一) 多线程作为Java中很重要的一个知识点,在此还是 ...
- [java多线程] - Thread&Runnable运用
负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能 ...
- [Java多线程]-Thread和Runable源码解析
多线程:(百度百科借一波定义) 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提 ...
- java多线程-Thread
大纲 sleep yield join setDaemon sleep: public static native void sleep(long millis) throws Interrupted ...
随机推荐
- 获取客户端Mac地址
近期有个需求,需要获取客户端Mac地址作为白名单验证的依据.使用.net,B/S架构.先百度找了一些获取mac地址的方法, using System; using System.Collections ...
- 【POJ1961 Period】【KMP】
题面 一个字符串的前缀是从第一个字符开始的连续若干个字符,例如"abaab"共有5个前缀,分别是a, ab, aba, abaa, abaab. 我们希望知道一个N位字符串S的前缀 ...
- Codeforces 639E - Bear and Paradox(二分+贪心)
Codeforces 题目传送门 & 洛谷题目传送门 原来 jxd 作业里也有我会做的题 i 了 i 了 首先这种题目的套路就是先考虑对于一个固定的 \(c\),怎样求出得分最高的策略,而类似 ...
- AWS EKS 添加IAM用户角色
作者:SRE运维博客 博客地址: https://www.cnsre.cn/ 文章地址:https://www.cnsre.cn/posts/211203931498/ 相关话题:https://ww ...
- SUNTANS 及 FVCOM 对流扩散方程求解简介[TBC]
最近接到一个任务,就是解决FVCOM中对流扩散计算不守衡问题.导师认为是其求解时候水平和垂向计算分开求解所导致的,目前我也没搞清到底有什么问题,反正就是让把SUNTANS的对流扩散计算挪到FVCOM中 ...
- 【基因组注释】RepeatMasker和RepeatModeler安装、配置与运行避坑
目录 1.conda安装 2.配置RepBase 3.RepeatMasker避坑 4.RepeatProteinMask避坑 5.RepeatModeler避坑 6.自定义重复序列库 后记 1.co ...
- Notepad++—英文版卡框架翻译
用到了,就积累到这里,不急一时,慢慢沉淀. 一.File 二.Edit 三.Search 四.View视图 Always on top #总在最前 Toggle full screen mode ...
- Linux命令行好玩的命令
0.cal 2019 #输出日历并显示今天是哪一天 1.命令"date",显示系统的当前日期和时间: 2.命令"date 040100002016",屏幕显示 ...
- github小白的记录随笔
此文章是基础本地安装好了git环境的新手小白. 进入您要上传项目的根路径,右键选择Git Bash Here. 输入命令: git init //初始化git仓库环境 git remote add o ...
- 爬虫系列:连接网站与解析 HTML
这篇文章是爬虫系列第三期,讲解使用 Python 连接到网站,并使用 BeautifulSoup 解析 HTML 页面. 在 Python 中我们使用 requests 库来访问目标网站,使用 Bea ...