java线程的join() 和join(long millis)用法 精确控制线程时间

这个我查了很多的网站都没有给一个比较合理的解释,但终于还是自己清楚了。

首先说一下在JDK中的解释

join():Waits for this thread to die.就是等待这个线程的结束(die)

join(long millis) :Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever. 也就是在设置的millis是间内等待线程的结束,如果超时,将无限的等直到这个线程结束。

join()用法很简单这里就不再说了、只说一下join(long millis) 的用法。有一个例子说明一下:

package tread;

public class WaitAThreadToDie {

 public static void main(String[] args) {
   Thread first=new WaitThreaDie("a","a",200);
   Thread second=new WaitThreaDie("b","b",300);
   Thread third=new WaitThreaDie("c","c",500);
   first.start();
   second.start();
   third.start();
   try{
    first.join(2000);//当主线程运行到这里的时候让其等2000毫秒让first线程结束,但是second 和third还按它们创建的时间运行和结束
   }catch(InterruptedException e){    
   }
         System.out.println("hanjiang");//   当主线程运行到这的时候输出这个字符串
 }

}
class WaitThreaDie extends Thread{
 private String firstName,secondName;
 private long total,aWhile;
 public WaitThreaDie(String firstName,String secondName,long waitTime){
  this.aWhile=waitTime;
  this.firstName=firstName;
  this.secondName=secondName;
 }
 public void run(){
  try{
  while(total<1000){//   当sleep超过1000毫秒时些线程结束
   System.out.println(firstName);
   sleep(aWhile);
   total+=aWhile;
   System.out.println(secondName+" sleep");//表示当前这个线程sleep了一次
   
  }
  }catch(InterruptedException e){
   System.out.println("cus Thread interrupted!..");
  }
  System.out.println(secondName+" stopped!");
 }
}

运行结果如下:

a
b
c
a sleep
a
b sleep
b
a sleep
a
c sleep
c
a sleep
a
b sleep
b
a sleep
a
b sleep
b
a sleep
a stopped!                 //   first线程结束 
hanjiang                   // 当first结束时时就输出这个这符串
c sleep
c stopped!
b sleep
b stopped!

当然了,可以看到first线程最先结束,但是这和 jion(2000); 无关,在线程运行的任务完成时,线程就会结束,这时设置的这个时间参数就没有实际作用了。下面从输出线路果进行分析,三个线程的sleep的次数分别是:

first: 5次

second : 4次

third :    3次

然而线程的结束顺序是  firist->third->second

因为在first sleep了5次之后,运行时间就有1000毫秒了,这时候second还没有运行结束了,因为这时候scond 每次加的是300毫秒,他只有sleep了4次之后也就是加到1200毫秒时才会超过1000毫秒,所以此时second还没有运行结束,可是理论上third 也结束了,但是为什么third没有在first之前结束呢?这是因为first是先start()的,而且每一个start()都要分配内存等信息,所以会花费时间,于是必然也就是first先结束了。也就是在这个时间差,这时MAIN.Thread 也就是主线程就会接着输出字符串"hanjiang" 了。所以以上的线结果就完全的合理了,这当然也是计算机的计算顺序了。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值