我在函數寫了這個:如何「嘗試啓動」從其他多個線程一個線程,JAVA
if(myThread.isAlive()) {
} else {
myThread.start();
}
但這是不安全的,如果多個線程調用該函數的同一時間。啓動正在運行的線程會引發異常。
因此,除了在其周圍放置試衣服以外,還有其他選擇嗎?
我在函數寫了這個:如何「嘗試啓動」從其他多個線程一個線程,JAVA
if(myThread.isAlive()) {
} else {
myThread.start();
}
但這是不安全的,如果多個線程調用該函數的同一時間。啓動正在運行的線程會引發異常。
因此,除了在其周圍放置試衣服以外,還有其他選擇嗎?
使此方法同步。此外,此檢查(isAlive()
)是不安全的,因爲如果線程已完成,則無法再次啓動它(並且isAlive()
將返回false ...)
是的。當線程結束時,總是重新創建thead。這不是問題。我的目標不是讓這個方法同步,因爲我想讓其他線程同時調用它。 – karl 2011-05-11 15:20:29
@karl - 我很難看出你爲什麼想要同時訪問一些對象(不一定是線程),而不是線程**。這是一個問題的處方。我想你可以在線程結束後重新啓動它。這應該會導致IllegalStateException。我會去創建新的線程。 – MByD 2011-05-11 15:45:55
if(myThread.isAlive()){ } else { synchronized(thread){ if(thread.getState()== Thread.State.NEW) thread.start(); } } --->這是我的解決方案。 thx雖然。 – karl 2011-05-11 16:00:42
我只會在我打算啓動它時創建線程。
你可以做的是
synchronized(thread) {
if(thread.getState() == Thread.State.NEW)
thread.start();
}
已經完成不會是活着的線程,但它不能被retstarted。
與每個人可能會說的相反:不要使用isAvile()或getState(),都需要將它們執行到同步中。沿着w/thread.start()並且要求線程實際上使用它自己作爲監視器(實際上它是這樣做的)
而是隻是捕獲start()的異常(IllegalThreadStateException
)並忽略它。
try{
thread.start()
}catch(IllegalThreadStateException _x){
//ignore or log the reason, use getState(), if need be
}
如果你不打算當線程是活做任何事情,只是沒有結果'如果{myThread.start();}(myThread.isAlive()!)' – unholysampler 2011-05-11 15:08:04
@unholysampler,這不會工作無線同步 – bestsss 2011-05-11 22:27:57
@bestsss:當然。這就是爲什麼我只是把它作爲評論發佈,它根本沒有解決這個問題。 – unholysampler 2011-05-12 00:42:49