java线程学习之join方法

时间:2023-03-09 22:12:06
java线程学习之join方法

join()方法表示一个线程要加入另一个线程,直到被加入的线程执行完毕。

这个概念不好理解的话看面这个例子

 public class TestJoin {
public static void main(String[] args) {
MyThread2 t1 = new MyThread2("ceshi");
t1.start();
try {
t1.join(); //执行到这个方法时,主线程会等着t1线程执行结束才会继续执行
System.out.println("t1线程是否死亡"+t1.isAlive());//此时t1线程已经执行完毕终止掉了
} catch (InterruptedException e) {} for(int i=1;i<=10;i++){
System.out.println("i am main thread");
}
}
}
class MyThread2 extends Thread {
MyThread2(String s){
super(s);
} public void run(){
for(int i =1;i<=10;i++){
System.out.println("i am "+getName());
try {
sleep(1000);
} catch (InterruptedException e) {
return;
}
}
}
}

上面这个例子是已开始有主线程main,然后创建了个 t1 线程 ti线程调用了join方法。就把线程主线程暂停了等待着  t1 线程执行完毕,等 t1 线程执行结束后,t1线程终止。主线程main继续执行直至结束。

执行结果为:

java线程学习之join方法

join的本质是让调用线程wait()在当前线程实例上

因为jdk实现join的代码为

java线程学习之join方法

 public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0; if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
} if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}

jdk的join(long millis)方法

里面核心的代码片段为:

java线程学习之join方法

join的三种用法

join() 等待该线程终止。正如上面所介绍

join(long millis)等待该线程终止的时间最长为 millis 毫秒。这个会等待被加入的线程执行 millis多毫秒,等待结束后,线程一起运行。将上面举的例子修改一下

将 t1.join(); 替换成 t1.join(3000);

java线程学习之join方法

join(long millis,int nanos) 等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。 其余的和  join(long millis)一样。
三种方式如果被打断的话都会抛出 InterruptedException异常。