如何“尝试启动”来自其他几个线程的一个线程,java

时间:2011-05-11 15:01:30

标签: java multithreading thread-safety

我在我的函数中写道:

if(myThread.isAlive()) {
} else {
myThread.start();
}

但如果许多线程同时调用此函数,则这是不安全的。启动正在运行的线程会引发异常。

所以除了把try-catch放在它周围之外,我还有其他选择吗?

4 个答案:

答案 0 :(得分:3)

使此方法同步。此外,此检查(isAlive())是不安全的,因为如果线程已经完成,则无法再次启动它(isAlive()将返回false ...)

答案 1 :(得分:1)

我打算在我打算启动时创建该线程。

你能做的是

synchronized(thread) {
    if(thread.getState() == Thread.State.NEW)
        thread.start();
}

已完成的线程不会活着,但无法重新启动。

答案 2 :(得分:0)

答案 3 :(得分:0)

与每个人都说的相反:不要使用isAvile()或getState(),两者都要求将它们执行为同步。阻止w / thread.start(),并要求线程实际上将自己用作监视器(事实上它是这样做的)

相反,只需捕获start()的异常(IllegalThreadStateException)并忽略它。

try{
  thread.start()
}catch(IllegalThreadStateException _x){
//ignore or log the reason, use getState(), if need be
}