执行逻辑:在当前代码块(比如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. STM32F4 阿波罗寄存器 进阶版LED灯

    上一节通过使用操作地址的方式进行了寄存器的操作,接下来通过两个部分,实现进阶版的操作寄存器(将寄存器的地址进行命名,然后使用名字进行调用  比如商场的A座5楼345号为卖玩具的,我们可以定义地址为sh ...

  2. JavaScript&&jQuery创建新节点和操作属性对比

    JavaScript创建新节点和操作属性 通过JavaScript原生接口创建节点,在处理上是非常复杂与繁琐的. <!DOCTYPE html> <html lang="e ...

  3. SpringBoot-配置文件相关(五)

    SpringBoot-配置文件 SpringBoot官方文档 配置相关 SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的 application.properties 语法结构 : ...

  4. go proxy athens 部署到k8s

    目录 go proxy athens 部署到k8s 一.athens简介 二.部署 1.创建 PersistentVolume 2.创建service 3.创建deployment 4.ci/cd中使 ...

  5. openstack网络(四)-虚机流量分析

    几种网络名词解释 使用LinuxBridge时虚机流量分析 VLAN FLAT Local VXLAN 使用OVS时虚机流量分析 几种网络名词解释 1.local网络:local网络是与其他网络和节点 ...

  6. Spring Data-Spring整合Hibernate基于JPA规范

    JPA:由 Sun 公司提供了一对对于持久层操作的标准(接口+文档) Hibernate:是 Gavin King 开发的一套对于持久层操作的自动的 ORM 框架. Hibernate JPA:是在 ...

  7. 数据库Oracle和MySQL 的不同

    实例区别: MySQL是轻量型数据库,开源免费.Oracle收费,这个不是重点,,重点是它贵. MySQL一个实例可以操作多个库,而Oracle一个实例只能对应一个库. MySQL安装只有300多兆, ...

  8. numpy的基本API(一)——创建

    numpy的基本创建API iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.np.empty([a, b]) empty方法可以在无需初始化的情况下创建认 ...

  9. 【JS】374- 重学 this 关键字

    为什么要学习this关键字 1. 面试会问啊!总有一些面试官喜欢问你一段不可能这么写的代码.看一道经典且古老的面试题(学完本文后,文末会有一道更复杂的面试题等着你哦!) 代码如下: let a = 5 ...

  10. 【HTTP】267- HTTP 的15个常见知识点复习

    前言 自从入职新公司到现在,我们前端团队内部一直在做 ?每周一练 的知识复习计划,我之前整理了一个 [每周一练 之 数据结构与算法] (https://juejin.im/post/5ce2a20e6 ...