java线程的isAlive()方法不能正常工作?

时间:2010-06-29 12:48:04

标签: java multithreading

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

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();
        }

    }

}

5 个答案:

答案 0 :(得分:10)

在您致电start()和致电isAlive()之间,线程很有可能已经开始,执行和完成。

Java不保证这些事情发生的顺序。它可以立即执行生成的线程,或者可以选择将其推迟到稍后。

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

  

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

在检查start()之后调用isAlive()永远不会起作用。

答案 1 :(得分:3)

如果我的记忆很好,java在线程切换之间有相当长的时间,所以isAlive可能会失败,因为线程尚未活着。尝试在thread.start()和thread.isAlive()

之间添加一些等待时间

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我没有看到您发布的代码的重点。 Thread.start()启动线程:您不需要启动它两次。我没有看到你的代码如何能够真实地处理它有一个Thread并且不知道它是否已经启动的情况;无论如何,有很多方法可以解决这个问题,所以不可能发生。

答案 4 :(得分:0)

最近发生在我身上,使用

进行了修复
if(yourThread.getState() == Thread.State.NEW){    
    yourThread.start();
}

代替yourThread.isAlive();