【问题标题】:How to stop thread returning before Join() is called如何在调用 Join() 之前停止线程返回
【发布时间】:2012-02-09 23:29:35
【问题描述】:

这纯粹是一个理论问题,因为我不确定导致此问题的条件是否普遍。

例如,假设您有一个线程,您使用它的 start 方法启动:

Thread c = new Thread();
c.start();

然后直接在线程上调用 Join() 方法,告诉你所在的方法等待线程执行完毕后再继续。

c.join();

线程是否有可能在调用 join 方法之前执行并完成,因此该方法不知道它必须等待 c 完成才能继续?我想你可以在调用 start() 方法之前尝试调用 join() 方法,但是每当我在测试用例中尝试过这个时,都会出现错误。

任何人都知道可能的解决方法,或者 JVM 会处理它吗?正如我所说的,我无法触发这种情况,但理论上是有可能的......

【问题讨论】:

  • 根据其他人的意见,可以得出结论,任何其他线程上的 join() 只是对调用线程的标准检查。

标签: java multithreading


【解决方案1】:

根据Thread#join(long millis)源码,isAlive()方法用于检查线程状态。

/**
 * Tests if this thread is alive. A thread is alive if it has
 * been started and has not yet died.
 *
 * @return  <code>true</code> if this thread is alive;
 *          <code>false</code> otherwise.
 */
public final native boolean isAlive();

如果线程结束,这个方法显然会返回false,所以thread.join()会立即退出。

【讨论】:

    【解决方案2】:

    c.join() 表示当前正在执行的线程应该等待c 完成才能完成。如果c 在调用c.join() 之前完全执行,则满足该条件,因为c 已完成执行。您调用c.join() 的方法不会“知道”; c.join() 就像没有操作一样。

    【讨论】:

      【解决方案3】:

      您可以在线程启动之前调用join(),但由于线程尚未启动,join() 将立即返回。

      如果在线程启动后调用join(),而线程已经终止,join()也会立即返回。

      join() 会阻塞的唯一时间是Thread.isAlive()

      这段代码可以正常工作...

         public static void main( String[] args ) throws InterruptedException
         {
            Thread t = new Thread( new Runnable()
            { 
               public void run()
               {
                  System.out.println( "thread" );
               }
            } );
            t.join();
            System.out.println( "joined" );
      
            Thread.sleep( 2000 );
            System.out.println( "call start" );
            t.start(); 
         }
      

      【讨论】:

        【解决方案4】:

        join 方法语义的意思是“等到加入线程完成”,这几乎是所有支持多线程的编程语言的标准。因此,完全有可能加入一个已经完成的线程,JVM会简单地检测到它已经完成并继续执行代码。

        【讨论】:

          【解决方案5】:
          如果线程没有运行,

          join() 将立即返回。

          【讨论】:

            【解决方案6】:

            为什么不将 CountdownLatch 与 callable 和 future 一起使用。例如http://sycure.wordpress.com/2012/01/21/example-using-java-future-and-countdownlatch/

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-11-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-16
              • 2017-08-16
              相关资源
              最近更新 更多