执行逻辑:在当前代码块(比如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. 【LiteOS】STM32F103-LiteOS移植教程(详细篇)【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  2. 使用Python开发小说下载器,不再为下载小说而发愁 #华为云·寻找黑马程序员#

    需求分析 免费的小说网比较多,我看的比较多的是笔趣阁.这个网站基本收费的章节刚更新,它就能同步更新,简直不要太叼.既然要批量下载小说,肯定要分析这个网站了- 在搜索栏输入地址后,发送post请求获取数 ...

  3. 为什么说 Java 中只有值传递?

    对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文章可以把这个事情讲解的通俗易懂. ...

  4. Xcode 10 Error: Multiple commands produce

    目录 Xcode 9.4.1运行react-native 可以,但是在Xcode 10运行报错,报错信息如下: 解决方法 1. 选择 File > Project Settings (或者 Fi ...

  5. Linux编辑器vi使用方法详细介绍(转)

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...

  6. Table表格滑过当前项[当前行][当前列]对应高亮

    效果演示图: JS 代码如下: function TableHover($table){       $table.mouseenter(function(event) {            va ...

  7. jQuery中的基本的选择器学习(补充版)

    先看整体代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  8. 如何在ASP.NET Core 中快速构建PDF文档

    比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间. 在本 ...

  9. Codeforces Round #595 (Div. 3) D2Too Many Segments,线段树

    题意:给n个线段,每个线段会覆盖一些点,求删最少的线段,使得每个点覆盖的线段不超过k条. 思路:按右端点排序,之后依次加入每个线段,查询线段覆盖区间内的每个点,覆盖的最大线段数量,如果不超过k,那就可 ...

  10. TypeScript高级用法详解

    引言 作为一门强大的静态类型检查工具,如今在许多中大型应用程序以及流行的JS库中均能看到TypeScript的身影.JS作为一门弱类型语言,在我们写代码的过程中稍不留神便会修改掉变量的类型,从而导致一 ...