菜鳥成長之路之Thread的join()原始碼分析(5)
阿新 • • 發佈:2018-12-16
有些業務要求我們當所有執行緒任務執行完後,做下記錄或者是做別的事,那麼我們在Thread裡面是應該怎麼實現呢?
今天我們來看Thread的join();
public final void join(long millis) 等待該執行緒終止的時間最長為 millis 毫秒。超時為 0 意味著要一直等下去。 引數:millis- 以毫秒為單位的等待時間。 丟擲:InterruptedException- 如果任何執行緒中斷了當前執行緒。當丟擲該異常時,當前執行緒的中斷狀態 被清除
public final void join(long millis,int nanos)
等待該執行緒終止的時間最長為 millis
毫秒 + nanos
納秒。
引數:millis
- 以毫秒為單位的等待時間。nanos
- 要等待的 0-999999 附迦納秒。
丟擲: - 如果 millis 值為負,則 nanos 的值不在 0-999999 範圍內。
- 如果任何執行緒中斷了當前執行緒。當丟擲該異常時,當前執行緒的中斷狀態 被清除。
public final void join()
等待該執行緒終止。
丟擲: - 如果任何執行緒中斷了當前執行緒。當丟擲該異常時,當前執行緒的中斷狀態 被清除。
public final void join() throws InterruptedException { join(0); }
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; } } }
public final synchronized void join(long millis, int nanos)
throws InterruptedException {
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
millis++;
}
join(millis);
}
下面貼出實現程式碼:
class JoinD implements Runnable{
@Override
public void run() {
for (int i = 0; i < 60; i++) {
System.out.println(Thread.currentThread().getName()+"..."+i);
}
}
}
public class JoinDemo {
public static void main(String[] args) throws InterruptedException {
JoinD j = new JoinD();
Thread t1 = new Thread(j);
Thread t2 = new Thread(j);
t1.start();
t2.start();
t1.join();
t2.join(1);
for (int i = 0; i < 80; i++) {
System.out.println("main....run"+i);
}
System.out.println("over");
}