在面试中经常会遇到这样的问题:在主线程中有两个子线程,如果能让着两个子线程能顺序的执行?

答案自然是用join来使得两个线程顺序执行,先看一下具体代码

public class ThreadOfJoin {

public static void main(String[] args) throws Exception {

MyThread luck = new MyThread("Luck");

MyThread timi = new MyThread("Timi");

luck.start();

luck.join();

timi.start();

}

@Data

static class MyThread extends Thread {

private String userName;

public MyThread(String userName) {

this.userName = userName;

}

@Override

public void run() {

try {

for (int i = 0; i < 5; i++) {

System.out.println(userName + " - " + i);

Thread.sleep(1000);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

每个线程启动后,打印五次信息,通过不同的名字来区分是哪个线程打印的。执行结果如下

Luck - 0

Luck - 1

Luck - 2

Luck - 3

Luck - 4

Timi - 0

Timi - 1

Timi - 2

Timi - 3

Timi - 4

通过结果可以看到join可以使得两个线程是顺序执行,那为什么join能控制线程顺序执行呢,我们看下join的具体实现

//外部调用的方法

public final void join() throws InterruptedException {

join(0);

}

//内部的具体实现

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;

}

}

}

首先join通过synchronized关键字来保证线程安全,主线程在调用了luck.start()之后调用了luck.join(),当luck线程未执行完成是,主线程会被以下代码阻塞

if (millis == 0) {//join()方法默认milis为0

while (isAlive()) {//线程未执行完成,此条件为true

wait(0);//等待notify

}

}

当luck线程执行完成之后,此线程的生命周期即将结束,在生命周期结束前,luck线程会使用notifyAll()方法,通知所有正在等待该对象锁的线程(我即将死去,你们不要再等了)。wait(0)接收到notify之后,会再次进行isAlive()判断,luck死亡之后,就跳出循环,join方法结束,之后就继续执行主线程中的其他代码。

同时我们也能看到join方法里面能传递时间参数,大概作用就是等待指定时间之后,如果之前线程还未执行完成,那么久不再等待。

java thread join_java中thread的join方法为什么能让线程插队相关推荐

  1. java有push方法么_[Java教程]js中push和join方法使用介绍

    [Java教程]js中push和join方法使用介绍 0 2013-10-09 07:00:17 push和join方法想必大家并不陌生吧,在本文将为大家详细介绍下js中的push和join方法的使用 ...

  2. java线程 yield_Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  3. java wait 参数_java中wait()和join()方法的区别是什么

    java中wait()和join()方法的区别是:存在不同的java包中:wait()方法用于线程间通信,它所施加的等待状态的线程可以被启动:join()方法用于在多个线程之间添加排序,它所施加的等待 ...

  4. java窗体中添加图片_在java窗体程序中添加图片的方法

    在java窗体程序中添加图片的方法 发布时间:2020-06-16 11:24:13 来源:亿速云 阅读:148 作者:Leah 这篇文章主要为大家详细介绍了在java窗体程序中添加图片的方法,图文详 ...

  5. java删除数组中重复元素的方法

    java删除数组中重复元素的方法 方法一:for双循环 方法二:利用HashMap,储存元素 方法一:for双循环 1.声明int类型index,该数即可为不重复元素下标,还可统计数组中不重复元素的个 ...

  6. Java的Map中的map.keySet()方法

    参考: java 常用的数据结构 一:Java的Map中的map.keySet()方法 该方法返回map中所有key值的列表. 今天再代码中看到了Map集合中的HashMap的map.keySet() ...

  7. CompleteFuture的 join方法会阻塞主线程,使用小心

    今天发现一个关于CompleteFuture的疑问,按道理join方法会阻塞,但是发现并不会,参加如下: public static void main(String[] args) {Long to ...

  8. Thread源码分析之join方法

    2019独角兽企业重金招聘Python工程师标准>>> join方法示例1 源码 import java.util.concurrent.TimeUnit;public class ...

  9. JAVA数组拼接 join_在 Java 中如何使用 join 方法连接多个字符串?

    String 类的 join 方法可以用指定的分隔符连接多个字符串. public static String join(CharSequence delimiter, CharSequence... ...

最新文章

  1. HGOI 20190709 题解
  2. 阿里云高可用-容灾解决方案
  3. office word 开发
  4. python中的字符串是什么,一文秒懂Python中的字符串
  5. CGCTF-Web-签到2
  6. html中写随机数,为HTML生成一个随机数
  7. [渝粤教育] 西南科技大学 货币银行学 在线考试复习资料(1)
  8. 使用Python完美管理和调度你的多个任务
  9. 字符数组的初始化与赋值
  10. linux监控内存情况同时清理内存脚本
  11. 实验——示波器法测量相位差(试验记录)
  12. Java IO流经典实例
  13. 我国祖冲之密码算法ZUC128和ZUC256性能测试
  14. QMainWindow界面添加标题栏
  15. 二进制炸弹实验bomb-whu 拆弹
  16. 群体优化算法工具箱分享(GA、PSO、CS、GWO、WOA、HHO)
  17. 今日头条的新闻推荐算法原理
  18. spring源码解析,vip视频解析源码
  19. 拼多多下单助手怎么一键采购、发货的?
  20. 使用 PSCP将文件从 Windows 计算机快速传输到 Linux计算机

热门文章

  1. ccna考试真题及经验介绍
  2. 为什么BCH有了0确认还要缩短时间
  3. Silverlight Blend动画设计系列六:动画技巧(Animation Techniques)之对象与路径转化、波感特效...
  4. Windows 下noinstall方式安装 mysql-5.7.5-m15-winx64
  5. 【源代码】基于Android和蓝牙的单片机温度採集系统
  6. 模拟出ios中流行的黑色背景底
  7. Microsoft Hyper-V Server 2008 R2和SCVMM2012部署XenDesktop 5.6桌面虚拟化系列之三准备XenDesktop服务器...
  8. [转]python 装饰器
  9. 白盒测试实践作业任务分配
  10. 快速傅里叶变换(FFT)算法【详解】