Java執行緒之join
阿新 • • 發佈:2019-02-07
簡述
Thread類的join方法用來使main執行緒進入阻塞狀態,進而等待呼叫join方法的執行緒執行,join有三個過載方法:
public final void join()
使主執行緒進入阻塞狀態,直到呼叫join的執行緒執行完成,如果執行緒被中斷將丟擲InterruptedException異常
public final synchronized void join(long millis):
使主執行緒最多阻塞指定時間(毫秒)
public final synchronized void join(long millis, int nanos)
使主執行緒最多阻塞指定時間(毫秒),可以精確到納秒
例項
主執行緒等待所有子執行緒先執行完成
package com.lkf.mulithread;
public class ThreadJoinExample {
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable(), "執行緒t1");
Thread t2 = new Thread(new MyRunnable(), "執行緒t2");
Thread t3 = new Thread(new MyRunnable(), "執行緒t3" );
t1.start();
//兩秒鐘以後啟動第二個執行緒
try {
t1.join(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
//第一個執行緒完成之後啟動第三個執行緒
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
t3.start();
//三個子執行緒先執行完,然後繼續主執行緒
try {
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("所有執行緒執行完畢");
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Thread started:::" + Thread.currentThread().getName());
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread ended:::" + Thread.currentThread().getName());
}
}
結果:
Thread started:::執行緒t1
Thread started:::執行緒t2
Thread ended:::執行緒t1
Thread started:::執行緒t3
Thread ended:::執行緒t2
Thread ended:::執行緒t3
所有執行緒執行完畢