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):等待超时毫秒数的更多相关文章

  1. Java 多线程基础(十)interrupt()和线程终止方式

    Java 多线程基础(十)interrupt()和线程终止方式 一.interrupt() 介绍 interrupt() 定义在 Thread 类中,作用是中断本线程. 本线程中断自己是被允许的:其它 ...

  2. join当前线程等待指定的线程结束后才能继续运行

    模拟一个QQ游戏大厅斗地主 /** sleep(休眠.睡眠) join当前线程等待指定的线程结束后才能继续运行 */ class Player extends Thread{ private Stri ...

  3. “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. Java多线程Thread.yield(),thread.join(), Thread.sleep(200),Object.wait(),Object.notify(),Object.notifyAll()的区别

    Thread.yield(),在某个线程里调用Thread.yield(),会使这个线程由正在运行的running状态转变为等待cpu时间片的runable状态.join()是Thread类的一个非s ...

  6. Java多线程Thread

    转自:http://www.cnblogs.com/lwbqqyumidi/p/3804883.html Java总结篇系列:Java多线程(一)   多线程作为Java中很重要的一个知识点,在此还是 ...

  7. [java多线程] - Thread&Runnable运用

    负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能 ...

  8. [Java多线程]-Thread和Runable源码解析

    多线程:(百度百科借一波定义) 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提 ...

  9. java多线程-Thread

    大纲 sleep yield join setDaemon sleep: public static native void sleep(long millis) throws Interrupted ...

随机推荐

  1. nginx得请求转发代码-将请求转发到网关

    首先:本地主机host更改成 192.168.111.1 gulimail.com 这样一访问网址就能映射到本地. 然后修改nginx得conf worker_processes 1; events ...

  2. Redis基本数据类型底层数据结构

    Redis数据类型底层数据结构 Redis目前基本的数据类型有String.List.Set.ZSet.Hash五种,首先Redis是C语言开发的,所以底层就是用C语言封装数据结构或者C语言本身提供的 ...

  3. 【POJ2018】【实数域上的二分】【dp】

    传送门:http://poj.org/problem?id=2018: 大概题意是求一个正整数数列 A 的平均数最大 长度不小于 L 的子段 我们可以二分答案 判定是否有一个长度不小于L的子段 平均数 ...

  4. 洛谷 P5233 - [JSOI2012]爱之项链(Polya 定理+递推)

    洛谷题面传送门 首先很明显题目暗示我们先求出符合条件的戒指数量,再计算出由这些戒指能够构成的项链的个数,因此考虑分别计算它们.首先是计算符合条件的戒指数量,题目中"可以通过旋转重合的戒指视作 ...

  5. 洛谷 P6672 - [清华集训2016] 你的生命已如风中残烛(组合数学)

    洛谷题面传送门 题解里一堆密密麻麻的 Raney 引理--蒟蒻表示看不懂,因此决定写一篇题解提供一个像我这样的蒟蒻能理解的思路,或者说,理解方式. 首先我们考虑什么样的牌堆顺序符合条件.显然,在摸牌任 ...

  6. Docker Hadoop 配置常见错误及解决办法

    Docker Hadoop 配置常见错误及解决办法 问题1:wordcount运行卡住,hadoop 任务运行到running job就卡住了 INFO mapreduce.Job: Running ...

  7. springboot与数据访问之jdbc

    官网的starthttps://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-starter 添加依 ...

  8. MAC下如何连接安卓(小米)手机进行互传文件?

    命令行: brew cask install android-file-transfer AndroidFileTransfer, 在andorid设备和您的mac电脑之间浏览和传输文件: 不论通过什 ...

  9. Python基础之字符串类型内置方法

    目录 1. 字符串类型 2. 常用操作及内置方法 3. 其他内置方法 1. 字符串类型 用途:姓名,性别等 定义: name1 = 'zhaojun' name2 = "zhaojun&qu ...

  10. urllib的基本使用介绍

    1. urllib中urlopen的基本使用介绍 1 ### urllib中urlopen的基本使用介绍 2 3 ## urlopen的基本用法(GET请求) 4 import urllib.requ ...