Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何";“尝试开始”;一个线程来自其他几个线程,java_Java_Multithreading_Thread Safety - Fatal编程技术网

如何";“尝试开始”;一个线程来自其他几个线程,java

如何";“尝试开始”;一个线程来自其他几个线程,java,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我在函数中写道: if(myThread.isAlive()) { } else { myThread.start(); } 但如果多个线程同时调用此函数,则这是不安全的。启动正在运行的线程会引发异常 所以,除了把try-catch放在它周围,我还有其他选择吗?使这个方法同步。此外,此检查(isAlive())是不安全的,因为如果线程已完成,则无法再次启动它(并且isAlive()将返回false…)使此方法同步。此外,此检查(isAlive())是不安全的,因为如果线程已完成,则无法再次启动

我在函数中写道:

if(myThread.isAlive()) {
} else {
myThread.start();
}
但如果多个线程同时调用此函数,则这是不安全的。启动正在运行的线程会引发异常


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

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

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

是否使用?使用?

使用?使用?

我只会在打算启动线程时创建线程

你能做的就是

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

已完成的线程将不处于活动状态,但无法重新启动。

我只会在打算启动它时创建线程

你能做的就是

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

已完成的线程将不会处于活动状态,但无法重新启动。

与大家可能会说的相反:不要使用isAvile()或getState(),两者都需要执行同步。沿w/thread.start()阻塞,并要求线程实际使用自己作为监视器(事实上它是这样做的)

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

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

与大家可能会说的相反:不要使用isAvile()或getState(),两者都需要同步执行。沿w/thread.start()阻塞,并要求线程实际使用自己作为监视器(事实上它是这样做的)

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

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

如果您不打算在线程处于活动状态时执行任何操作,那么如果(!myThread.isAlive()){myThread.start();}@unholysampler,则在不同步thread@bestsss:当然可以。这就是为什么我只是把它作为一个评论发布,它根本没有解决这个问题。如果你不打算在线程处于活动状态时做任何事情,那么如果(!myThread.isAlive()){myThread.start();}@unholysampler,结果就不是
If(!myThread.isAlive()){myThread.start();}
@unholysampler,这在线程上不同步就不会起作用thread@bestsss:当然可以。这就是为什么我只是把它作为一个评论发布,它根本没有解决这个问题。线程结束时,始终会重新创建THAD。这不是问题。我的目标不是使此方法同步,因为我希望其他线程同时调用它。@karl-我很难理解为什么您希望访问某个对象(不一定是线程)的次数多于同时访问线程的次数。这是一个导致问题的方法。我想你可以在线程结束后重新启动它。这将导致非法状态异常。我会改为创建新线程。thx虽然如此。@karl-我的意思差不多,但是检查isAlive是不必要的,因为
thread.getState()
也涵盖了这种情况。祝你好运@卡尔-因此,如果你得到的答案很好地回答了你的问题,你将其标记为已接受(答案左勾),如果其中一个答案令你满意(彼得的、安东尼的或我的),请将其标记为已接受,这样人们就不会认为你仍在寻找答案。是的。线程结束时,始终会重新创建THAD。这不是问题。我的目标不是使此方法同步,因为我希望其他线程同时调用它。@karl-我很难理解为什么您希望访问某个对象(不一定是线程)的次数多于同时访问线程的次数。这是一个导致问题的方法。我想你可以在线程结束后重新启动它。这将导致非法状态异常。我会改为创建新线程。thx虽然如此。@karl-我的意思差不多,但是检查isAlive是不必要的,因为
thread.getState()
也涵盖了这种情况。祝你好运@卡尔-因此,如果你得到的答案很好地回答了你的问题,你将其标记为已接受(答案左勾),如果其中一个答案令你满意(彼得的、安东尼的或我的),请将其标记为已接受,这样人们就不会认为你仍在寻找答案。