如何在调用Join()之前停止返回线程

时间:2012-02-09 14:56:54

标签: java multithreading

这纯粹是一个理论问题,因为我不确定引起这个问题的条件会很常见。

比方说,你有一个线程,你开始使用它的启动方法:

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

然后直接在线程上调用Join()方法来告诉你所处的方法,直到线程被执行继续。

c.join();

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

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

6 个答案:

答案 0 :(得分:10)

根据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()将立即退出。

答案 1 :(得分:6)

c.join()表示当前正在执行的线程应该在完成之前等待c完成。如果c在调用c.join()之前完全执行,则满足该条件,因为c已完成执行。你打电话给c.join()的方法不会“知道它”; c.join()就像是无操作。

答案 2 :(得分: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(); 
   }

答案 3 :(得分:0)

join方法语义意味着“等到加入的线程完成”,这几乎是支持多线程的每种编程语言的标准。因此,完全可以加入已经完成的线程,JVM将只检测它已经完成并继续执行代码。

答案 4 :(得分:0)

如果线程没有运行,

join()将立即返回。

答案 5 :(得分:0)

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