1. 程式人生 > >菜鳥成長之路之Thread的join()原始碼分析(5)

菜鳥成長之路之Thread的join()原始碼分析(5)

有些業務要求我們當所有執行緒任務執行完後,做下記錄或者是做別的事,那麼我們在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");
	}