先看例子:
网上的例子

/**
* join的用法,哪个线程调用join哪个线程就插队先执行
*/
public class JoinTest {public static void main(String[] args) {//开启学习线程Study study = new Study();study.setName("学习线程------");study.start();try {study.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() +"-----学习完毕,准备干别的事");}}class Study extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "我想学习study 多线程 join 用法,但是没有资料,开始百度找资料");Baidu baidu = new Baidu();baidu.setName("百度线程------");baidu.start();try {baidu.join(); //先去百度找资料,然后才能学习} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "开始学习");}
}class Baidu extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "开始百度,找资料中");for (int i = 1; i <= 2; i++) {System.out.println(Thread.currentThread().getName() + i + "秒");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "找到资料");}
}

运行效果:

学习线程------我想学习study 多线程 join 用法,但是没有资料,开始百度找资料
百度线程------开始百度,找资料中
百度线程------1秒
百度线程------2秒
百度线程------找到资料
学习线程------开始学习
main-----学习完毕,准备干别的事

结论:
1、哪个线程调用join代表哪个线程要插在当前线程的前面执行。也就是说哪个线程执行这句代码,哪个线程就被阻塞。其他线程不受影响。比如把study.join();去掉,主线程会先执行完。
2、join 源码还是调用的是wait方法进行等待。然后等线程执行完会调用notify,或者notifyAll 方法。所以使用join自己不要轻易调用wait,notify,notifyAll 方法。
以下为join 源码注释翻译:
This implementation uses a loop of {@code this.wait} calls conditioned on {@code this.isAlive}. As a thread terminates the {@code this.notifyAll} method is invoked. It is recommended that applications not use {@code wait}, {@code notify}, or {@code notifyAll} on {@code Thread} instances.
这个实现使用了一个循环{@code This。等待}调用条件为{@code this.isAlive}。当一个线程终止{@code这个。调用notifyAll}方法。建议应用程序不要在{@code Thread}实例上使用{@code wait}、{@code notify}或{@code notifyAll}。

public final synchronized void join(long millis)
throws InterruptedException {long base = System.currentTimeMillis();long now = 0;if (millis < 0) {throw new IllegalArgumentException("timeout value is negative");}if (millis == 0) {while (isAlive()) {// 判断子线程也就是正在执行的那个线程是否还存活着,如果是就继续等待。wait(0);}} else {while (isAlive()) {long delay = millis - now;if (delay <= 0) {break;}wait(delay);now = System.currentTimeMillis() - base;}}
}

3、join 加上时间参数的话最后时间还是加在wait方法上,所以是让线程等待多长时间。等待时间超时后就不再等待了。
4、join 适用于需要控制线程执行顺序的场景中。

多线程之join用法相关推荐

  1. Java多线程之Semaphore用法

    Java多线程之Semaphore用法 本文目录: Semaphore基本概念 Semaphore使用案例:3个停车位,6辆车去抢,走一辆,抢一个停车位. 1. Semaphore基本概念 在信号量上 ...

  2. Java多线程之CyclicBarrier用法

    Java多线程之CyclicBarrier用法 本文目录 CyclicBarrier的基本概念 CyclicBarrier的案例:集齐7颗龙珠就可以召唤神龙 1. CyclicBarrier的基本概念 ...

  3. Java多线程之CountDownLatch用法

    Java多线程之CountDownLatch用法 本文目录: CountDownLatch基本概念 CountDownLatch案例:6个同学陆续离开教室后班长才可以关门 CountDownLatch ...

  4. Java线程之join

    简述 Thread类的join方法用来使main线程进入阻塞状态,进而等待调用join方法的线程执行,join有三个重载方法: public final void join() 使主线程进入阻塞状态, ...

  5. Java线程之Synchronized用法

    synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对 ...

  6. java 多线程之join

    t.join();表示当前线程停止执行直到t线程运行完毕: t.join(1000); 表示当前线程等待t线程运行1000后执行: package org.thread;/*** t.join()表示 ...

  7. 多线程之join方法

    一.前言: 在很多情况下,我们都是通过主线程创建并启动子线程的,如果子线程中需要耗费大量的时间计算的话,主线程往往会比子线程先结束,这个时候就会导致有时候主线程想获取子线程计算之后的结果,但是却获取不 ...

  8. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  9. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

最新文章

  1. 大数处理之一(加法和乘法)
  2. Linux命令:MySQL系列之五--SELECT单表查询、多表查询升级及删除,插入
  3. [LeetCode] 5. Longest Palindromic Substring
  4. 2011寒假-joomla学习笔记
  5. jmeter之ip欺骗
  6. 洛谷 题解 P4955 【[USACO14JAN]Cross Country Skiing 越野滑雪】
  7. 索尼录音笔怎么导出录音内容_录音笔十大品牌名单出炉!录音笔十大品牌排名榜单揭晓!...
  8. 使用tinylog 1.0简化您的日志记录
  9. 当你不知道今天星期几,不妨在编辑器写下这段代码
  10. 计算机寄存器端口,CPU和外设之间的数据传送方式有哪几种
  11. Machine Learning Mastery 博客文章翻译:深度学习与 Keras
  12. [妙味Ajax]第三课:AJAX跨域解决方案:JSONP
  13. [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)...
  14. H5JS二维动画制作!two.js的基本操作class2
  15. uni-app image组件当显示不出图片时显示默认图片
  16. 智慧校园视频监控管理系统平台建设的详情分析
  17. mysql 跨库查询_mysql跨库联表查询
  18. HTML5 学习笔记(一)——HTML5概要与新增标签
  19. Mysql --分表、分库、分区(横向纵向、分区列)的区别与详解
  20. Word-embedding的资料整理

热门文章

  1. java递归生成树结构_突破CRUD | 万能树Java工具类封装(源码)
  2. Android中下载编译Volley
  3. Win7+keras+tensorflow使用YOLO-v3训练自己的数据集
  4. 【软工】第一次阅读作业
  5. Data - 信息获取途径汇总
  6. 模糊搜索cell效果
  7. (八)ASP.NET自定义用户控件(1)
  8. 如何阻止通过Outlook用户发送WORD或EXCEL变成带Winmail.dat文件附件的邮件
  9. 梦想——似乎忘记了是什么了
  10. 用SeaMonkey写cnblogs博客时碰到的问题