我在我的函数中写道:
if(myThread.isAlive()) {
} else {
myThread.start();
}
但如果许多线程同时调用此函数,则这是不安全的。启动正在运行的线程会引发异常。
所以除了把try-catch放在它周围之外,我还有其他选择吗?
答案 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
}