Java 線程加入

2018-02-28 15:33 更新

Java線程教程 - Java線程加入


線程可以等待另一個(gè)線程死亡或終止。

例子

假設(shè)有兩個(gè)線程,t1和t2。如果線程t1調(diào)用t2.join(),線程t1開始等待,直到線程t2終止。

調(diào)用t2.join()阻塞直到t2終止。

如果其中一個(gè)線程無(wú)法繼續(xù),直到另一個(gè)線程完成執(zhí)行,在程序中使用join()方法是很有用的。

下面的代碼有一個(gè)例子,當(dāng)程序完成執(zhí)行時(shí),它在標(biāo)準(zhǔn)輸出上打印一條消息。

public class Main {
  public static void main(String[] args) {
    Thread t1 = new Thread(Main::print);
    t1.start();
    System.out.println("Done.");
  }

  public static void print() {
    for (int i = 1; i <= 5; i++) {
      try {
        System.out.println("Counter: " + i);
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

上面的代碼生成以下結(jié)果。

從結(jié)果我們可以看到“完成”。被打印在來(lái)自真實(shí)線程的消息之前。 t1.start(); 剛剛啟動(dòng)該線程,它會(huì)阻斷執(zhí)行,并等待線程完成。

下面的代碼使用join()等待線程完成,然后打印“完成”。

public class Main {
  public static void main(String[] args) {
    Thread t1 = new Thread(Main::print);
    t1.start();
    try {
      t1.join();
      // "main" thread waits until t1 is terminated
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("Done.");
  }

  public static void print() {
    for (int i = 1; i <= 5; i++) {
      try {
        System.out.println("Counter: " + i);
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

上面的代碼生成以下結(jié)果。

注意

Thread類的join()方法是重載的。

其他兩個(gè)版本接受超時(shí)參數(shù)。

如果我們使用join()方法和超時(shí),調(diào)用者線程將等待,直到它被調(diào)用的線程被終止或超時(shí)已經(jīng)過(guò)去。

我們應(yīng)該在線程啟動(dòng)后調(diào)用join()方法。

如果我們?cè)谖磫?dòng)的線程上調(diào)用join()方法,它立即返回。

如果我們?cè)诮K止的線程上調(diào)用join()方法,它立即返回。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)