java join(long millis),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" 了。所以以上的线结果就完全的合理了,这当然也是计算机的计算顺序了。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值