Java中 join(long millis)的问题
Start是有启动时间的,谁先谁后不确定。
■网友
结论:本题的运行输出还会有其他的可能,这是并发的不确定性造成的。分析:先列下基本知识和事实:1、start方法的作用仅仅是请求JVM启动一个线程,而这个线程具体何时开始运行是由操作系统决定的。也就是说,先start的线程未必就比后start的线程先开始运行(尽管简单的例子中常常显示出先start先运行的现象)。2、内部锁的调度仅支持非公平调度,即锁的调度过程中允许“插队”现象的出现,因此“先下手‘为强’,下手快的线程会先获得锁。3、join(long millis)等待目标线程终止是有时间限制的,过了这个时间如果目标线程仍然未终止,那么该方法会自动返回。4、执行Thread.sleep不会使当前线程释放任何锁5、线程a、b的终止都至少需要5s(因为它们的run方法中调用了sleep方法)6、线程a、b、main这个3个线程完全是并发的,尽管它们可能争用同一个锁(b)7、wait方法在其返回前会以原子操作的方式释放该方法所属对象的内部锁并使其执行线程暂停8、join方法内部是通过调用wait实现的根据2,线程main、a、b这三个线程谁先获得内部锁(b)是不确定的,再根据7,线程main即使先获得内部锁也会在其执行join方法过程中先释放相应的内部锁,而在此之后join方法可能由于等待超时(根据5)而自动返回接着就执行输出语句,因此我们就可以看到多种“main end”夹杂在其他线程的输出之间的。乍一看似乎不可能出现“main end”夹杂在“begin X。。。end X”之间的情形,但是由于join方法执行期间(返回之前)并不是一直持有内部锁的(根据7、8),因此这种夹杂由于2导致的不确定性而成为可能。对于具体的可能,可以列一个表格按照上述分析画一下就明白了。如下的执行顺序解释了“结果1”,其他的输出结果可以参照下面的方法分析(一行中的动作表示各个线程在一时刻执行的动作): 【Java中 join(long millis)的问题】 
建议:不仅仅是初学者,我认为所有的开发人员在使用一个方法的时候必须要明确这个方法的具体(精确)的功能是什么,乃至于这个方法的内部实现细节。比如,String类有个split方法能够接收一个正则表达式来将一个字符串分割为几个部分,如果你不了解在它的内部实现,在不该用它的时候用了它会导致字符串分割效率非常低!对于大量而频繁的字符串分割,我们可能需要直接使用String.split内部使用的Pattern类的split方法,甚至是自己写分割算法!因此,平时多看Java API doc是一个良好的习惯。——国内首部多线程设计模式图书《Java多线程编程实战指南(设计模式篇) 》,在京东http://item.jd.com/11785190.html、亚马逊http://www.amazon.cn/dp/B016IW624G等书店有售。试读:Java多线程编程实战指南(设计模式篇)试读样章
■网友
仔细又看了几眼,题主阴人啊,两种情况截的图的是同一种的,但是确实是有多种情况的,做足同步后等于手动切换线程就能很清楚看到了。——————————————————————我将题中代码稍微加了点同步后运行结果为:main JOIN IN at 2Thread-B START at 2Thread-B FINISH at 5068Thread-A START at 5068Thread-A FINISH at 10068main JOIN OUT at 10069可以看到JOIN甚至阻塞了10s!会出现这样的问题,是因为线程的执行顺序不唯一,还有就是wait等待期间会释放锁导致到时间了获得不了锁不能按时退出。A线程先获得了b的锁,那么主线程和B线程都要等待。A释放唤醒时主线程获得锁,而join方法中通过wait等待,不会占用锁。B线程获得锁sleep,一直持有锁,导致join一直阻塞。最后同时结束。另一种情况是主线程先获得锁,同理。Thread.wait()关键代码如下 while (isAlive()) { long delay = millis - now; if (delay \u0026lt;= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; }
推荐阅读
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- 27岁,转行java的血与泪,该何去何从
- 怎样统计工程中未使用的java类
- 新互联网网站用Java还靠谱么对比Php,Python,Ruby的话
- 我想学java和安卓软件开发?
- 学计算机专业,java那些和网站开发选台式还是笔记本好
- JAVA设计思路
- 本人大专毕业一年,想要去培训,定了JAVAEE和安卓两个方向,应该学那个纠结,求帮助
- 从未接触过软件测试和java,可以学习主要是自学这两种其一吗
