2012-02-09 58 views
7

这纯粹是一个理论问题,因为我不确定引起此问题的条件是否会很常见。如何在Join()被调用之前停止线程返回

比方说你有,你踢掉它线程的启动方法:直接后

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

然后,调用线程上的join()方法来告诉你在等待的方法直到线程被执行继续。

c.join(); 

这难道不是一种可能性,即线程可能被执行和完成的连接方法被调用之前,因此离开该方法不知道它必须等待C到完成它继续之前?我想你可以在调用start()方法之前尝试调用join()方法,但是无论何时在测试用例中尝试过,都会出现错误。

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

+0

为什么它是一个问题? – 2012-02-09 15:12:07

+0

在别人认为的答案中,推断任何其他线程上的join()仅仅是调用线程的标准检查都不会有错。 – soufrk 2017-07-16 07:41:05

回答

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

0

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

6

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

0

如果线程没有运行,join()将立即返回。

2

您可以在线程启动之前调用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(); 
    } 
相关问题