【问题标题】:Why don't the lines before join() method printing prior to start of 'joined' thread in java?为什么在 java 中“加入”线程开始之前 join() 方法之前的行不打印?
【发布时间】:2018-05-08 04:07:07
【问题描述】:

我知道何时在一个线程内调用 join 方法,然后该线程必须等到“joined Thread”终止。但是如果在调用 join() 方法之前有更多代码 - 会发生什么?我在以下代码中发布了我的代码和混淆:

class MyJoinThread extends Thread {

   public static Thread myMain;

   public void run() {
     for(int i = 0; i< 2; i++) {
        System.out.println("I am loop");
     }
     try {
        myMain.join();
     }
     catch(InterruptedException ex) {
        ex.printStackTrace();
     }

     for(int j = 0; j < 5; j++) {
        System.out.println("I am "+ Thread.currentThread().getName());
     }
  }
}

class MyJoinMainThread {
   public static void main(String [] args) {
       MyJoinThread.myMain = Thread.currentThread();
       MyJoinThread th = new MyJoinThread();
       th.start();

       for(int i = 0; i<10; i++){
          System.out.println("I am " + Thread.currentThread());
      }
   }


}

给定的输出是:

I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am loop
I am loop
I am Thread-0
I am Thread-0
I am Thread-0
I am Thread-0
I am Thread-0

为什么输出不是这样的?

   I am loop
   I am loop
   I am Thread[main,5,main]
   .....
   I am Thread[main,5,main]
   I am Thread-0
   ..
   I am Thread-0
   I am Thread-0

我在主线程上调用 join() 方法之前包含一个循环。为什么在主线程开始执行之前不打印这些行?因为该循环是在调用 join() 方法之前调用的。

【问题讨论】:

  • 这是 system.out + err 吗? ;) ...如何加入“主线程”!?? System.exit(int);? :) ...不,说真的:你不能依赖任何之前加入,但加入之后你可以确定 main 是“完成”..
  • main() 在调用 th.start() 时不必停止;您的代码可能不是“确定性的”。阅读上下文切换
  • @AbdulAhad - Abdul Ahad - 确实,在这段代码中,哪个线程将首先启动,我们无法假设。它可能首先是主线程,也可能首先是“MyJoinThread”。但是必须发生一件事,那就是当 myMain.join() 调用时,“MyJoinThread”必须等待“主线程”的终止。

标签: java multithreading


【解决方案1】:

这是我在运行程序时得到的(每次运行后I am loopI am Thread[main,5,main] 的顺序都会发生变化):

I am Thread[main,5,main]
I am loop
I am loop
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread[main,5,main]
I am Thread-0
I am Thread-0
I am Thread-0
I am Thread-0
I am Thread-0

由于主线程中的System.out.println("I am " + Thread.currentThread()); 和第二线程中的System.out.println("I am loop"); 之间没有同步(也没有发生前关系https://www.logicbig.com/tutorials/core-java-tutorial/java-multi-threading/happens-before.html),因此无法保证这些语句在控制台中的顺序。

实际顺序取决于调度程序以及 JVM 在您的 PC 上生成新线程所需的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 2020-07-20
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2016-12-27
    相关资源
    最近更新 更多