此线程联接代码是什么意思?

2022-08-31 07:06:36

在此代码中,两个连接和中断是什么意思? 导致停止直到终止?t1.join()t2t1

Thread t1 = new Thread(new EventThread("e1"));
t1.start();
Thread t2 = new Thread(new EventThread("e2"));
t2.start();
while (true) {
   try {
      t1.join();
      t2.join();
      break;
   } catch (InterruptedException e) {
      e.printStackTrace();
   }
}

答案 1

此线程联接代码是什么意思?

引用 Thread.join() 方法 javadocs 的话

join()等待此线程失效。

有一个线程正在运行您的示例代码,它可能是主线程

  1. 主线程创建并启动 和 线程。这两个线程开始并行运行。t1t2
  2. 主线程调用以等待线程完成。t1.join()t1
  3. 线程完成,方法在主线程中返回。请注意,在进行调用之前可能已经完成,在这种情况下,调用将立即返回。t1t1.join()t1join()join()
  4. 主线程调用以等待线程完成。t2.join()t2
  5. 线程完成(或者它可能在线程完成之前完成),并且方法在主线程中返回。t2t1t2.join()

重要的是要了解 和 线程一直在并行运行,但启动它们的主线程需要等待它们完成才能继续。这是一种常见的模式。此外,和/或可能在主线程调用它们之前完成。如果是这样,那么不会等待,但会立即返回。t1t2t1t2join()join()

t1.join()意味着导致 t2 停止,直到 t1 终止?

不。正在调用的主线程将停止运行并等待线程完成。线程并行运行,完全不受调用或调用的影响。t1.join()t1t2t1t1.join()

就 try/catch 而言,throws 意味着正在调用的主线程本身可能会被另一个线程中断。join()InterruptedExceptionjoin()

while (true) {

在循环中进行连接是一种奇怪的模式。通常,在每种情况下,您都会执行第一个联接,然后执行第二个联接以适当地处理。无需将它们放在循环中。whileInterruptedException


答案 2

这是一个最喜欢的Java面试问题。

Thread t1 = new Thread(new EventThread("e1"));
t1.start();
Thread e2 = new Thread(new EventThread("e2"));
t2.start();

while (true) {
    try {
        t1.join(); // 1
        t2.join(); // 2  These lines (1,2) are in in public static void main
        break;
    }
}

t1.join()意思是,t1 说“我想先完成”。的情况也是如此。无论谁开始或线程(在本例中为方法),main 都将等到并完成其任务。t2t1t2maint1t2

但是,需要注意的一点是,无论 和 上的联接调用序列如何,它们本身都可以并行运行。这是必须等待的线程。t1t2t1t2main/daemon