!!!!!线程join方法的timeout的理解!!!

zabaglione 2013-01-23 11:49:41
对于threadA.joion(timeout)的理解,很多资料上面都说是等待时间超时
但是具体是什么超时?是threadA开始运行的时候就开始计时呢?
我做了一个例子


class Sleeper extends Thread{
private int duration;

public Sleeper(String name,int sleepTime){
super(name);
duration = sleepTime;
start();
}

public void run(){
try{
sleep(duration);
}catch(InterruptedException e){
}
}
}

class Joiner extends Thread{
private Sleeper sleeper;
public Joiner(String name,Sleeper sleeper){
super(name);
this.sleeper = sleeper;
start();
}
public void run(){
try{
sleeper.join(5);
}catch(InterruptedException e){
System.out.println("time out!!");
}
System.out.println(getName()+" join completed");
}
}

public class Joining{
public static void main(String[] args){
Sleeper sleepy = new Sleeper("Sleepy",1500),
grumpy = new Sleeper("Grumpy",1500);
Joiner dopey = new Joiner("Dopey",sleepy),
doc = new Joiner("Doc",grumpy);

}
}


这里的join(5),我本来的意思让joiner等待5毫秒就超时,但是效果不是这样。它一直没有超时。。
...全文
315 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zabaglione 2013-01-23
  • 打赏
  • 举报
回复
那么这个join是如何判断阻塞的? 比如我把sleep时间设置成10分钟 他还是照样等待sleep结束的。 那么这个join(5)的5毫秒是从什么时候开始计算的? 从什么时间开始超过了5毫秒就认为超时了?
龙四 2013-01-23
  • 打赏
  • 举报
回复
首先如果join的线程没有运行结束,调用join就会阻塞 如果没有设置一个时间,它会一直阻塞到对应的线程执行结束 如果设置了一个超时时间,那就有两种情况下它会从阻塞中返回,一是对应的线程结束了,二是超时时间过完了
zabaglione 2013-01-23
  • 打赏
  • 举报
回复
引用 3 楼 ticmy 的回复:
a.join(5); 不是指的a这个线程过5毫秒就超时 是当前线程调用join开始计时,5毫秒若a线程还没有结束,当前线程就……
终于明白了。我搞错了,我以为join(5)之后,超过5毫秒就会抛出异常。 所以我就奇怪为什么catch里面的time out!!打不出来。 非常感谢。
龙四 2013-01-23
  • 打赏
  • 举报
回复
引用 2 楼 zabaglione 的回复:
那么这个join是如何判断阻塞的? 比如我把sleep时间设置成10分钟 他还是照样等待sleep结束的。 那么这个join(5)的5毫秒是从什么时候开始计算的? 从什么时间开始超过了5毫秒就认为超时了?
a.join(5); 不是指的a这个线程过5毫秒就超时 是当前线程调用join开始计时,5毫秒若a线程还没有结束,当前线程就继续往下执行

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧