这纯粹是一个理论问题,因为我不确定引起这个问题的条件会很常见。
比方说,你有一个线程,你开始使用它的启动方法:
Thread c = new Thread();
c.start();
然后直接在线程上调用Join()方法来告诉你所处的方法,直到线程被执行继续。
c.join();
是否有可能在调用join方法之前执行并完成线程,因此让方法不知道在继续之前必须等待c完成?我想你可以在调用start()方法之前尝试调用join()方法,但是只要我在测试用例中尝试过这种方法,就会出现错误。
任何人都知道可能的解决方法,或者JVM是否处理它?正如我所说,我无法触发这种情况,但从理论上说它是可能的......
答案 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/