Java 线程加入

Java线程教程 – Java线程加入

线程可以等待另一个线程死亡或终止。

例子

假设有两个线程,t1和t2。如果线程t1调用t2.join(),线程t1开始等待,直到线程t2终止。

调用t2.join()阻塞直到t2终止。

如果其中一个线程无法继续,直到另一个线程完成执行,在程序中使用join()方法是很有用的。

下面的代码有一个例子,当程序完成执行时,它在标准输出上打印一条消息。

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();
      }
    }
  }
}

上面的代码生成以下结果。

从结果我们可以看到“完成”。被打印在来自真实线程的消息之前。 t1.start(); 刚刚启动该线程,它会阻断执行,并等待线程完成。

下面的代码使用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();
      }
    }
  }
}

上面的代码生成以下结果。

注意

Thread类的join()方法是重载的。

其他两个版本接受超时参数。

如果我们使用join()方法和超时,调用者线程将等待,直到它被调用的线程被终止或超时已经过去。

我们应该在线程启动后调用join()方法。

如果我们在未启动的线程上调用join()方法,它立即返回。

如果我们在终止的线程上调用join()方法,它立即返回。

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《Java 线程加入》
文章链接:https://zhuji.vsping.com/293742.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。