我正在尝试使用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();
}
}
}
答案 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();