【问题标题】:java join methodjava连接方法
【发布时间】:2011-11-09 12:01:25
【问题描述】:

在以下情况下,我无法理解 join 的含义:

Thread t1=new MyThread(1);
Thread t2=new MyThread(2);


t1.start();
t2.start();

t1.join();
t2.join();

问题是: 据我了解,开始调用线程的运行方法。 所以主线程首先越过开始,因此所有线程都被初始化。 然后主线程转到 t1.join,这意味着主线程将等到 t1 结束他的运行,然后才继续到 t2.join()。 我不明白的是 t1,t2 同时已经开始,所以它们在 run 方法中。 因此结果应该是出乎意料的。我对吗? 那么为什么它会按顺序出现: 我有以下运行方法:

void run(){
   for(int i=0; i<4; i++){
      System.out.println(j);
   }

}

当 j 是 MyThread 构造函数中的标识符时; 输出是:

2 2 2 2 1 1 1 1

或 1 1 1 1 2 2 2 2

【问题讨论】:

标签: java multithreading join


【解决方案1】:

尝试通过将迭代限制:i 增加到 1000 来运行相同的程序;然后比较结果。结果出乎意料,你的理解是正确的。

【讨论】:

  • 谢谢!!我确实将它更新到 100 并且确实得到了意想不到的结果。
【解决方案2】:

你的假设是正确的。但是,除非您的计算机上有多个内核,否则线程不会真正并行运行。当时只有一个处于活动状态,您的操作系统会在一段时间后交换它们。

因此,如果您增加线程中的循环大小,您会看到它被交换,但现在它会在另一个线程开始之前完成(大部分时间)。

【讨论】:

    【解决方案3】:

    如果你加入thread_1thread_2 也被执行并在thread_1 执行之前终止,那么thread_2.join() 不会产生任何效果,当前线程将继续执行。是的,你不能指望任何可预测的执行流程。

    【讨论】:

      【解决方案4】:

      join() 方法在线程死亡时立即返回。只有主线程在等待,其他已经启动的线程将继续执行。所以,如果t2t3t4t1.join()返回时已经执行完毕,其他join方法会立即返回。

      【讨论】:

      • 你能不能参考编辑的问题,也许我会更容易理解
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 2013-02-23
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      相关资源
      最近更新 更多