2010-06-29 90 views
5

我正在尝试java线程的isAlive()方法的一个例子。但是我发现即使线程已经启动,isAlive()方法也会返回false。有人可以告诉我我做错了什么?这是代码片段。java线程的isAlive()方法无法正常工作?

package app; 

public class ThreadAliveDemo { 

    public static void main(String[] args) { 

     Thread myThread; 

     myThread = new Thread() 
     { 
      public void run() 
      { 
          Thread.sleep(3000); 
       System.out.println("My Thread."); 
      } 
     }; 

     myThread.setName("My Thread"); 
     myThread.start(); 

     if(!myThread.isAlive()) 
     { 
      myThread.setName("My Thread"); 
      myThread.start(); 
     } 

    } 

} 
+1

改为使用Thread.getState(),它提供了额外的信息。开始线程两次也没有效果。 – bestsss 2011-01-28 01:56:33

+0

关于@bestsss建议:Brian Goetz的书“实践中的Java并发”说:“Thread.getState的结果不应该用于并发控制,并且对于测试的用处有限,它的主要用途是作为调试的来源信息。” – WoodenKitty 2016-07-01 00:21:33

+0

@WoodenKitty,虽然一个线程还没有启动getState()会很稳定(可能需要与线程启动同步)。戈茨的建议非常稳固,但在这种情况下不适用。 – bestsss 2016-12-03 23:27:33

回答

3

如果我的内存为我提供了很好的服务,java在线程切换之间有相当长的时间,所以有可能isAlive失败,因为线程是还没有活着。尝试在thread.start()和thread.isAlive()之间添加一些等待时间

+0

我尝试让线程睡眠3秒,但得到同样的问题。 – Rise 2010-06-29 13:02:22

+0

尝试使调用线程睡一秒钟(_and_让子线程睡3秒) – dbemerlin 2010-06-29 13:06:57

+0

它已完美运行..非常感谢。 – Rise 2010-06-29 13:28:01

10

有一个很好的机会,该线程将陆续开工,执行,完成,您的电话之间的start()和您的来电isAlive()

Java对这些事情发生的顺序没有提供任何保证。它可以立即执行产生的线程,或者可以选择延迟它,直到稍后。

顺便说一句,你的代码试图在线程死后重新启动线程。这是not permitted

多次启动线程 永远不合法。特别是,一旦 完成执行, 线程可能无法重新启动。

所以打电话start()检查后isAlive()永远不会工作。

+0

是啊......我需要在我的大脑和我的手指周围包裹一个“同步”模块 – skaffman 2010-06-29 12:53:14

+1

不,我尝试使用Thread.sleep(3000);在run方法内部调用。我仍然遇到同样的问题。 – Rise 2010-06-29 12:54:00

+0

但是怎么回事?我让我的线程睡了3秒。然后检查isAlive()调用。我认为在这种情况下,isAlive()调用必须返回true,但它仍然返回true结果。 – Rise 2010-06-29 13:00:06

1

我还没有在java中做过任何多线程,但是在我看来,像你的线程可能会在isAlive()检查之前运行并退出。毕竟,看起来你的线程只是印出一些东西然后死掉。

1

我没有看到您发布的代码点。 Thread.start()启动线程:你不需要启动它两次。我没有看到你的代码如何能够真实地转化为它具有线程并且不知道它是否已经启动的情况;无论如何,有很多方法来编码,所以它不会发生。

+1

这不是关于如何在现实生活中使用代码,而是为了使概念清晰。 – Rise 2010-07-01 13:57:20

+0

但是,它意味着线程在start()返回时并没有真正开始。你知道这是异步的。我不明白正在说明什么概念。 – EJP 2010-08-21 13:20:11