Java多线程神器:join使用及原理

转载自 Java多线程神器:join使用及原理




join()

join()是线程类 Thread的方法,官方的说明是:

Waits for this thread to die.

等待这个线程结束,也就是说当前线程等待这个线程结束后再继续执行,下面来看这个示例就明白了。

示例

public static void main(String[] args) throws Exception {System.out.println("start");

    Thread t = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println(i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();t.join();

    System.out.println("end");
}

结果输出:

start
0
1
2
3
4
end

线程t开始后,接着加入t.join()方法,t线程里面程序在主线程end输出之前全部执行完了,说明t.join()阻塞了主线程直到t线程执行完毕。

如果没有t.join(),end可能会在0~5之间输出。

join()原理

下面是join()的源码:

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;}}
}

可以看出它是利用wait方法来实现的,上面的例子当main方法主线程调用线程t的时候,main方法获取到了t的对象锁,而t调用自身wait方法进行阻塞,只要当t结束或者到时间后才会退出,接着唤醒主线程继续执行。millis为主线程等待t线程最长执行多久,0为永久直到t线程执行结束。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

页面残留数据该如何处理

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.6.13关于页面数据残留的问题&#xff0c;我前几天就遇到了&#xff0c;刚开始的时候我写完那个页面是不知道它有毛病的&#xff0c;后来我才发现了它居然有一个小问题。 先来…

基于maven的SpringMVC+Spring+MyBatis+Log4j2的pom配置

【0】README&#xff1a;本文旨在给出可以正常跑 测试用例的项目依赖配置&#xff0c; 同时还会给出 maven 编译项目时的坑儿&#xff1b; 【1】 pom配置&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/20…

一张图弄懂java线程的状态和生命周期

转载自 一张图弄懂java线程的状态和生命周期 上图是一个线程的生命周期状态流转图&#xff0c;很清楚的描绘了一个线程从创建到终止的过程。 这些状态的枚举值都定义在java.lang.Thread.State下 NEW&#xff1a;毫无疑问表示的是刚创建的线程&#xff0c;还没有开始启动。 RUNN…

如何添加数据到session中

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.6.17我们都知道session相当于服务器的一次对话&#xff0c;服务器会为每个新的用户创建一个新的 Session&#xff0c;并在 session 到期时撤销掉这个 Session 对象。所以sess…

MySQL8.0: Serialized Dictionary Information(SDI) 浅析

转自&#xff1a; https://yq.aliyun.com/articles/600183 SDI是Serialized Dictionary Information的缩写&#xff0c;是MySQL8.0重新设计数据词典后引入的新产物。我们知道MySQL8.0开始已经统一使用InnoDB存储引擎来存储表的元数据信息&#xff0c;但对于非InnoDB引擎&#…

非常有用的并发控制-倒计时器CountDownLatc

转载自 非常有用的并发控制&#xff0d;倒计时器CountDownLatch CountDownLatch见名思义&#xff0c;即倒计时器&#xff0c;是多线程并发控制中非常有用的工具类&#xff0c;它可以控制线程等待&#xff0c;直到倒计时器归0再继续执行。 给你出个题&#xff0c;控制5个线程执…

移除指定的session

在上次我写的文章中&#xff0c;我描述了如何把数据添加到session里面&#xff0c;再让临时表格读取session的数据显示到页面。 我们都知道&#xff0c;有添加就有移除对吧&#xff0c;哪么我们又该如何把临时表格里面的数据移除呢&#xff1f;嘿嘿&#xff0c;这个其实也挺简…

javap命令参数

C:\Users\pacoson>javap -help 用法: javap <options> <classes> 其中, 可能的选项包括:-help --help -? 输出此用法消息-version 版本信息-v -verbose 输出附加信息-l 输出行号和本地变量表-pub…

非常有用的并发控制-循环栅栏CyclicBarrier

转载自 非常有用的并发控制&#xff0d;循环栅栏CyclicBarrier昨天我讲了倒计时器CountDownLatch的应用&#xff0c;它是阻塞线程直到计时器归0的一种等待方式。今天讲的这个循环栅栏CyclicBarrier与倒计时器非常类似&#xff0c;但它比倒时器更加强大且稍微复杂&#xff0c;它…

一个会定时执行的方法

开发工具与关键技术&#xff1a;Visual Studio、MVC作者&#xff1a;幻奏撰写时间&#xff1a;2019.6.27我们在做项目的时候不是有一些要我们定时完成的任务吗&#xff1f;很多人应该都会用定时器来完成这个任务。我今天要讲的就是如何使用定时器的插件来完成我们今天的任务。 …

VC6.0下载及安装

转自&#xff1a; https://blog.csdn.net/weixin_37536336/article/details/81187963 希望对下载&#xff0c;并学习C语言的朋友&#xff0c;有帮助。 1.绿色版&#xff1a; 网址&#xff1a;https://pan.baidu.com/s/1jN70y8x6-_1XGJHESlMspA 密码&#xff1a;sla5 2.企业…

如何实现下拉框的绑定

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.7.5下拉框你们都见过吧&#xff0c;下拉框的作用是方便用户更快的输入&#xff0c;同时也限制了用户&#xff0c;再也不怕用户乱写啦。 下拉框我们该如何绑定呢&#xff0c;这…

volatile关键字解析~高级java必问

转载自 volatile关键字解析~高级java必问昨天我介绍了原子性、可见性、有序性的概念&#xff0c;那么今天就来见识下这些概念的主角-volatile关键字。volatile基本介绍volatile可以看成是synchronized的一种轻量级的实现&#xff0c;但volatile并不能完全代替synchronized&…

B树、B+树、B*树谈到R 树

转自&#xff1a; https://blog.csdn.net/v_JULY_v/article/details/6530142 从B 树、B 树、B* 树谈到R 树 作者&#xff1a;July、weedge、Frankie。编程艺术室出品。 说明&#xff1a;本文从B树开始谈起&#xff0c;然后论述B树、B*树&#xff0c;最后谈到R 树。其中B树、B树…

一个会定时完成的任务(二)

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.7.5上次我大概说了一下定时任务是如何实现的&#xff0c;由于我只是大概的说了那个插件是如何使用的&#xff0c;它的其他方法我还没和你们细说&#xff0c;所以&#xff0c;…

String.format()方法的使用

转载自 java字符串格式化&#xff1a;String.format()方法的使用常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的读者应该记得C语言的sprintf()方法&#xff0c;两者有类似之处。format()方法有两种重载形式。 l form…

转-《高性能mysql》并不是一本好书——SQL笔记

转自&#xff1a; https://book.douban.com/review/8122660/ 版权归作者所有&#xff0c;任何形式转载请联系作者。 作者&#xff1a;姚泽源&#xff08;来自豆瓣&#xff09; 来源&#xff1a;https://book.douban.com/review/8122660/ 在知乎上发过一次&#xff0c;这里也发一…

实现模糊查询并忽略大小写

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.7.13我们在实现查询功能的时候&#xff0c;常常会用到模糊查询。这个呀&#xff0c;可是很重要的&#xff0c;当用户输入条件查询时&#xff0c;我们就要显示对应的数据&…

字符串拼接方式

转载自 java提高篇之字符串对于字符串而言我们经常是要对其进行拼装处理的&#xff0c;在java中提高了三种拼装的方法&#xff1a;、concat()以及append()方法。这三者之间存在什么区别呢&#xff1f;先看如下示例&#xff1a; public class StringTest {/*** desc 使用、conca…

用js比较时间大小

开发工具与关键技术&#xff1a;Visual Studio、js 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.7.17对比时间的大小在很多项目里面都有用到&#xff0c;刚开始我还不会怎样比较时间的大小&#xff0c;后来上了老师的课之后&#xff0c;我才知道怎样比较时间的大小。 比较时…