61_有关多线程中join方法详解
Java中join()方法的理解
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。
比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
t.join(); //调用join方法,等待线程t执行完毕
t.join(1000); //等待 t 线程,等待时间是1000毫秒。
下面是一段JDK中的代码:
/*** Waits at most <code>millis</code> milliseconds for this thread to * die. A timeout of <code>0</code> means to wait forever. */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() 方法是没有作用的,将直接继续向下执行
Join方法实现是通过wait(小提示:Object 提供的方法)。 当main线程调用t.join时候,main线程会获得线程对象t的锁(wait 意味着拿到该对象的锁),调用该对象的wait(等待时间),直到该对象唤醒main线程 ,比如退出后。这就意味着main 线程调用t.join时,必须能够拿到线程t对象的锁。
通过下面一段代码解释:
package ThreadTest;import static java.lang.Thread.currentThread;
import static java.lang.Thread.sleep;/*** Created with IntelliJ IDEA.* User: Blank* Date: 14-3-28* Time: 下午7:49*/
public class TestJoin implements Runnable {public static void main(String[] sure) throws InterruptedException {Thread t = new Thread(new TestJoin());long start = System.currentTimeMillis();t.start();t.join(1000);//等待线程t 1000毫秒System.out.println(System.currentTimeMillis()-start);//打印出时间间隔System.out.println("Main finished");//打印主线程结束}@Overridepublic void run() {// synchronized (currentThread()) {for (int i = 1; i <= 5; i++) {try {sleep(1000);//睡眠5秒,循环是为了方便输出信息} catch (InterruptedException e) {e.printStackTrace();}System.out.println("睡眠" + i);}System.out.println("TestJoin finished");//t线程结束}//}
}
在注释掉synchronized修饰的run方法后,打印信息如下:
可以看到main线程等待了t线程1000毫秒之后,结束了,随后是t线程打印的数据。
那么如果加上run方法的synchronized那条语句呢?结果如下:
由于先调用了t.start()方法,线程进入synchronized代码段,main线程等待一秒以后,还是得不到线程t的对象锁,只能继续等待,直到线程t结束,释放锁。这里可以明确看到main线程等待时间是5000ms,有些文章里写的是t线程执行时间+join方法指定的时间(5000+1000 ),其实不是的,这里可以很清晰的看到,main线程等待时间只有5000ms,看到有的文章说join调用的wait也是需要获取对象锁的。
JDK源代码中wait操作是
public final native void wait(long timeout) throws InterruptedException;
wait内部实现应该是用synchronized,等待时间是5000+1000就好解释了,搞不明白。
此处存疑。
61_有关多线程中join方法详解相关推荐
- Java多线程中join方法详解
join()方法用于让当前执行线程等待join线程执行结束.其实现原理是不停的检查join线程是否存活,如果join线程存活则让当前线程永远等待. join()方法部分实现细节 while(isAli ...
- JavaScript中join()方法详解
前言 最近到了一个新公司,这边这个部门只有一个真正的前端,其他大部分都是后端,同样我也是,不过本人也会一点前端,不过没有那么精,好久没写前端了,都快忘了差不多了,现在来回顾一下. join()使用教程 ...
- java线程休眠sleep函数_Java多线程中sleep()方法详解及面试题
一. Java线程生命周期(五个阶段) 新建状态就绪状态运行状态阻塞状态死亡状态 如图 二.sleep方法 API中的解释 static voidsleep(long millis) 使当前正在执行的 ...
- java多线程中的join方法详解
java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...
- 【面试:并发篇09:多线程:interrupt 方法详解】
[面试:并发篇09:多线程:interrupt 方法详解] 00.前言 如果有任何问题请指出,感谢. 01.介绍 程序中,有些线程的中断需要外部干预,比如线程中存在while(true)循环,或者存在 ...
- numpy中reshape方法详解
numpy中reshape方法详解_zhanggonglalala的博客-CSDN博客_reshape
- JavaScript中getBoundingClientRect()方法详解
JavaScript中getBoundingClientRect()方法详解 getBoundingClientRect() 这个方法返回一个矩形对象,包含四个属性:left.top.right和bo ...
- Pandas中resample方法详解
Pandas中resample方法详解 Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法.重新取样时间序列数据. 方便的 ...
- php中魔术方法详解
〝 古人学问遗无力,少壮功夫老始成 〞php中魔术方法详解,在php中有一类方法,很奇怪常,那就是只要满足一定条件,就会自己执行,那就是php中的魔术方法,码字不易,出精品更难,没有特别幸运,那么请先 ...
最新文章
- PHP 作为SocketClient发送字节数组
- 苹果手机安装应用后无法上网问题的解决方法
- 这个机器人一个表情,看过的人不寒而栗
- WordPress导航菜单函数register_nav_menus() 和 wp_nav_menu()
- php 类遍历,php数组遍历类与用法示例
- 分层模型中数据传输过程
- 7.1.Zeng_Cache(2) --- 缓存原理
- linux支持raid5阵列,Linux中raid磁盘阵列,磁盘阵列raid5
- 服务器系统更新后找不到硬盘,重装win10系统找不到硬盘完美解决方法
- oracle 日志查看教程,Oracle 查看日志
- java 实现短信验证码功能
- Java语言与开发环境
- Git合并单个文件和[y,n,q,a,d,/,K,j,J,g,e,?]
- 还没对Docker加以限制?埋下的安全隐患了解一下
- 保留三位有效数字,四舍六入五成双
- java夯实基础系列:反射
- 终极版C语言(七)-尹成-专题视频课程
- 《你好,放大器》----学习记录(二)
- Poj 圣诞老人的礼物 贪心
- 菜鸟学汇编005 栈(Stack) 和 段寄存器SS、SP