执行逻辑:在当前代码块(比如main方法)中的线程A执行了join方法,

那么当代码块(main)执行到join方法时,会停止继续向下执行,一直到线程A执行完毕,

main方法才会继续向下执行。

代码一:

package com.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.IntStream; public class ThreadJoin {
public static void main(String[] args) throws InterruptedException {
Thread thread1=new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
},"线程1");
Thread thread2=new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
},"线程2"); //启动线程1
thread1.start();
//启动线程2
thread2.start(); /**
* 当代码执行到这一步的时候,程序不再向下执行,等待thread1执行完毕后向下执行
* 同时thread1和thread2相互挣多cpu调度资源
*/
thread1.join();
/**
* 当代码执行到这一步的时候,程序不在向下执行,等待thread2执行完毕后向下执行
* 因为此时的thread1已经执行完毕了,只用thread2执行
*/
thread2.join(); for(int i=0;i<2;i++){
System.out.println(Thread.currentThread().getName()+"#"+i);
TimeUnit.SECONDS.sleep(1);
}
} }

使用案例:

假如现在有一个长途车票销售网站,想要查询合肥到上海的汽车;

而合肥又有很多的汽车站(合肥1站,合肥2站,合肥3站),同时上海也有很多的汽车站(上海1站,上海2站,上海3站)。

这个时候网站平台需要调用合肥的各个汽车平台官方的接口来获取合肥到上海的车票信息。

正常的同步思维应该是这样子的:

1.先调用合肥1站到上海站的车票信息,耗时3s,

2.调用合肥2站到上海站的车票信息,耗时5s,

3.调用合肥3站到上海站的车票信息,耗时1s。

等这3个接口调用完毕后,组装返回的参数展示到界面。

有了线程的join方法就可以同时让这三个接口去请求接口,等三个接口调用完毕后再组装参数展示给客户。

这是总耗时取决于返回接口数据最慢的那一个接口。

Platform.java  车站类

package com.thread.car;

import java.util.ArrayList;
import java.util.List; /**
* 合肥车站1
*/
public class PlatForm { private String startCity;
private String endCity; public PlatForm(String startCity,String endCity) {
this.startCity=startCity;
this.endCity=endCity;
} private final List<String> list=new ArrayList<>(); public void search(){
this.list.add(this.startCity+"站到"+this.endCity+"1站的信息");
this.list.add(this.startCity+"站到"+this.endCity+"2站的信息");
this.list.add(this.startCity+"站到"+this.endCity+"3站的信息");
}
public List<String> get(){
return this.list;
}
}

Test.java 测试类

package com.thread.car;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit; public class Test { /*private static List<String> resList=new ArrayList<>();
private static synchronized void addList(List<String> list){
resList.addAll(list);
}*/ public static void main(String[] args) throws InterruptedException {
//List<String> list=new ArrayList<String>();
PlatForm pf1=new PlatForm("合肥1","上海");
PlatForm pf2=new PlatForm("合肥2","上海");
PlatForm pf3=new PlatForm("合肥3","上海"); Thread thread1=new Thread(new Runnable() {
@Override
public void run() {
try {
pf1.search();
TimeUnit.SECONDS.sleep(5);
System.out.println(Thread.currentThread().getName()+"执行结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"合肥1站");
Thread thread2=new Thread(new Runnable() {
@Override
public void run() {
try {
pf2.search();
TimeUnit.SECONDS.sleep(4);
System.out.println(Thread.currentThread().getName()+"执行结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"合肥2站");
Thread thread3=new Thread(new Runnable() {
@Override
public void run() {
try {
pf3.search();
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName()+"执行结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"合肥3站"); thread1.start();
thread2.start();
thread3.start(); long start=System.currentTimeMillis();
thread1.join();
thread2.join();
thread3.join();
long end=System.currentTimeMillis();
System.out.println((end-start)/1000);
List<String> list=new ArrayList<String>();
list.addAll(pf1.get());
list.addAll(pf2.get());
list.addAll(pf3.get());
for(String s:list){
System.out.println(s);
} }
}

线程join方法详解的更多相关文章

  1. [java] java 线程join方法详解

    join方法的作用是使所属线程对象正常执行run方法,而对当前线程无限期阻塞,直到所属线程销毁后再执行当前线程的逻辑. 一.先看普通的无join方法NoJoin.java public class N ...

  2. “全栈2019”Java多线程第七章:等待线程死亡join()方法详解

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

  3. “全栈2019”Java多线程第六章:中断线程interrupt()方法详解

    难度 初级 学习时间 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并发编程--多线程中的join方法详解

    Java Thread中, join()方法主要是让调用该方法的thread在完成run方法里面的部分后, 再执行join()方法后面的代码 例如:定义一个People类,run方法是输出姓名年龄. ...

  6. JAVA THREAD.JOIN方法详解

    一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: Thread t = new AThread(); t.start(); t.join(); 二.为什么要用join() ...

  7. Java多线程中join方法详解

    join()方法用于让当前执行线程等待join线程执行结束.其实现原理是不停的检查join线程是否存活,如果join线程存活则让当前线程永远等待. join()方法部分实现细节 while(isAli ...

  8. join() 方法详解及应用场景

    总结:join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用jo ...

  9. java线程基础方法详解

    一.线程状态转换 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行 ...

随机推荐

  1. git 使用详解(6)—— 3种撤消操作

    接下来,我们会介绍一些基本的撤消操作相关的命令.请注意,有些操作并不总是可以撤消的,所以请务必谨慎小心,一旦失误,就有可能丢失部分工作成果. 修改最后一次提交 git commit --amend 有 ...

  2. python3如何随机生成大数据存储到指定excel文档里

    本次主要采用的是python3的第三方库xlwt,来创建一个excel文件.具体步骤如下: 1.确认存储位置,文件命名跟随时间格式 2.封装写入格式 3.实现随机数列生成 4.定位行和列把随机数写入 ...

  3. Python 如何定义只读属性?【新手必学】

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Daniel2333如果还没学到属性问题,看不懂不怪你,可以先去小编的P ...

  4. 初步了解JVM第一篇

    大家都知道,Java中JVM的重要性,学习了JVM你对Java的运行机制.编译过程和如何对Java程序进行调优相信都会有一个很好的认知. 废话不多说,直接带大家来初步认识一下JVM. 什么是JVM? ...

  5. 经典常用SQL语句大全

    创建表 --删除表 --DROP TABLE [dbo].[Test] --创建表 CREATE TABLE [dbo].[Test] ( ,) PRIMARY KEY, ----自增主键 ) NUL ...

  6. springboot搭建一个简单的websocket的实时推送应用

    说一下实用springboot搭建一个简单的websocket 的实时推送应用 websocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议 我们以前用的http协议只能单 ...

  7. flask之分析线程和协程

    flask之分析线程和协程 01 思考:每个请求之间的关系 我们每一个请求进来的时候都开一个进程肯定不合理,那么如果每一个请求进来都是串行的,那么根本实现不了并发,所以我们假定每一个请求进来使用的是线 ...

  8. 从5个方面让你真正了解Java内存模型

    前言 首先我们在了解java内存模型之前先看一下计算机内存模型,理解了计算机内存模型的话后面在看JMM就会简单的多. 计算机内存 计算机是由CPU.主存.磁盘等组成的(简单引出问题熬)我们都知道计算机 ...

  9. CentOS7下设置网卡名称以eth开头

    一.前言 在CentOS7下,网卡的名称不再是以eth命名了,下以内容将教你如何在CentOS7下修改网卡以"eth"开头. 二.环境 ♦CentOS7.5_x86-64 三.配置 ...

  10. 将数据库中数据导出为excel表格

    public class Excel { private static Logger logger = LoggerFactory.getLogger(Excel.class); /** * 导出项目 ...