2011-05-11 216 views
1

我在函數寫了這個:如何「嘗試啓動」從其他多個線程一個線程,JAVA

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

但這是不安全的,如果多個線程調用該函數的同一時間。啓動正在運行的線程會引發異常。

因此,除了在其周圍放置試衣服以外,還有其他選擇嗎?

+0

如果你不打算當線程是活做任何事情,只是沒有結果'如果{myThread.start();}(myThread.isAlive()!)' – unholysampler 2011-05-11 15:08:04

+0

@unholysampler,這不會工作無線同步 – bestsss 2011-05-11 22:27:57

+0

@bestsss:當然。這就是爲什麼我只是把它作爲評論發佈,它根本沒有解決這個問題。 – unholysampler 2011-05-12 00:42:49

回答

3

使此方法同步。此外,此檢查(isAlive())是不安全的,因爲如果線程已完成,則無法再次啓動它(並且isAlive()將返回false ...)

+0

是的。當線程結束時,總是重新創建thead。這不是問題。我的目標不是讓這個方法同步,因爲我想讓其他線程同時調用它。 – karl 2011-05-11 15:20:29

+0

@karl - 我很難看出你爲什麼想要同時訪問一些對象(不一定是線程),而不是線程**。這是一個問題的處方。我想你可以在線程結束後重新啓動它。這應該會導致IllegalStateException。我會去創建新的線程。 – MByD 2011-05-11 15:45:55

+0

if(myThread.isAlive()){ } else { synchronized(thread){ if(thread.getState()== Thread.State.NEW) thread.start(); } } --->這是我的解決方案。 thx雖然。 – karl 2011-05-11 16:00:42

1

我只會在我打算啓動它時創建線程。

你可以做的是

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

已經完成不會是活着的線程,但它不能被retstarted。

0

與每個人可能會說的相反:不要使用isAvile()或getState(),都需要將它們執行到同步中。沿着w/thread.start()並且要求線程實際上使用它自己作爲監視器(實際上它是這樣做的)

而是隻是捕獲start()的異常(IllegalThreadStateException)並忽略它。

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