2021-04-18 11:25  阅读(64)
文章分类:Java 基础教程 文章标签:JavaJava 教程
©  原文作者:w3cschool 原文地址:https://www.w3cschool.cn/java/java-thread-multiple.html

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

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

2021041811219_1.png

从结果我们可以看到“完成”。被打印在来自真实线程的消息之前。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();
          }
        }
      }
    }
    
    

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

2021041811212_2.png

注意

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

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

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

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

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

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

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> Java 线程加入
上一篇
Java 线程休眠
下一篇
Java 线程生命周期