评论
# re: 深入浅出Java多线程(1)-方法 join
2008-09-04 20:46
Brian
学习了,我一直知道join方法的用法,但从没想法它的实现。受益啊! 回复 更多评论
# re: 深入浅出Java多线程(1)-方法 join
2008-09-08 23:04
Xsource
明白了····
谢谢 回复 更多评论
# re: 深入浅出Java多线程(1)-方法 join
2009-02-24 22:51
小石~~
好文章 不愧是深入浅出 拜读 回复 更多评论
# re: 深入浅出Java多线程(1)-方法 join
2009-04-09 15:59
Adams
bu cuo de 回复 更多评论
# re: 深入浅出Java多线程(1)-方法 join
2009-04-21 15:45
陌生人
看了你的文章.我测试了下,发现你最后一个例子中,“main方法t.join(1000),等待一秒钟,它必须等待ThreadTest 线程释放t锁后才能进入wait方法中,它实际等待时间是9000+1000 MS” ,它并不是如你写的这样,而是ReleaseObjectLock 和joinFinish几乎一起出现的。 ...
回复 更多评论
# re: 深入浅出Java多线程(1)-方法 join
2009-04-21 16:28
陌生人
我做了个测试:public static void main(String[] args) {
Thread t = new Thread(new RunnableImpl());
new ThreadTest(t).start();
// new ThreadTest(t).start();
t.start();
try {
System.out.println("joinBegin?");
t.join(50000);
System.out.println("joinFinish");
//t.start();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
当只有1个new ThreadTest(t).start();的时候,不管你 t.join(50000);里面写多少,都是一起出现最后结果ReleaseObjectLock,joinFinish。但是当你写了2个new ThreadTest(t).start(); 这个t.join(50000);里面数字就有关系了,它影响到了joinFinish打印的顺序,但是不管你怎么写,它都是和其中一个ReleaseObjectLock 一起出现..呵呵...希望我才现在回复这个还不嫌晚.. 回复 更多评论
# re: 深入浅出Java多线程(1)-方法 join[未登录]
2011-05-26 16:49
Michael
写得好,学习了 回复 更多评论
# re: 深入浅出Java多线程(1)-方法 join
2011-08-24 18:14
Scott Fan
博主啊,你最后这不把我们往坑里带嘛··
你看啊,
Thread的public final synchronized void join(long millis) 方法中
有这么一个分支:
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) // 大家注意这句啊!!
{
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
走到 while (isAlive()) 这个循环的时候,线程对象的isAlive()是false啊,所以直接就返回了,
不会像你说的似的,9000+1000毫秒。
大家看的时候别往坑里跳啊。 回复 更多评论
# re: 深入浅出Java多线程(1)-方法 join
2012-02-26 23:34
路人甲
哥们你这篇深入浅出写得...最后一个程序这毛病多了去了..新手不要往坑里跳....jion的JDK很有参考意义 最后一个程序作为捉虫程序(逻辑错误) 很有价值。。 回复 更多评论
# re: 深入浅出Java多线程(1)-方法 join
2012-02-27 00:11
路人甲
关于最后一个程序,按照作者所写程序,线程间的运行状况如下所述:
首先启动ThreadTest,对t加锁(注意,加锁的是t的代码块,此处对t加锁导致main不能获得t的锁,所以t.jion无法执行,但是不影响t线程本身start),然后sleep ,接着t.start(),t sleep 2秒。之后程序无事可做,再7秒之后,ThreatTest线程结束,锁释放。main获得t的锁,此时t线程已经不是alive。所以立刻输出jionFinish。在作者的程序中,t.jion相当于将main的线程blocked.若想达到作者最后一句所说的jion 9000+1000毫秒,则在ThreadTest释放锁之后,t线程应该处于alive状态。所以讲RunnableImpl中的sleep时间设置为大于10000,则实际等待时间为9000+1000毫秒。但是此时的输出顺序发生变化,为:
getObjectLock
Begin sleep
ReleaseObjectLock
jionFinish
End sleep
希望上述解释能够让大家走出作者的坑。。。另,我把这篇博文转载到我的blog里面进行更正了 回复 更多评论
# re: 深入浅出Java多线程(1)-方法 join[未登录]
2012-11-06 15:45
test
最后一个运行了一下,怎么也只有9秒啊?
Tue Nov 06 15:44:22 CST 2012getObjectLock
Tue Nov 06 15:44:22 CST 2012Begin sleep
Tue Nov 06 15:44:24 CST 2012End sleep
Tue Nov 06 15:44:31 CST 2012ReleaseObjectLock
Tue Nov 06 15:44:31 CST 2012joinFinish 回复 更多评论
# re: 深入浅出Java多线程(1)-方法 join[未登录]
2013-04-10 14:59
eason
@路人甲
精彩,了解了 回复 更多评论
# re: 深入浅出Java多线程(1)-方法 join[未登录]
2013-06-21 14:51
我
Begin sleep
joinFinish
End sleep
我的怎么不一样呀 回复 更多评论