java join(long millis),深入浅出Java多线程(1)-方法 join

评论

# 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

我的怎么不一样呀  回复  更多评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值