2011-12-14 40 views
0

我有一些單線程類被一些線程共享。在單例中創建線程

這個單我想創建另一個線程做一些工作的方法中現在(因此使用這個單身任何線程可以啓動附加線程任務)

我簡單的方法啓動線程:

mSThread = new Thread(job that implements Runnable); 
mSThread.start(); 

主題mSThread被聲明爲類的成員,我不認爲我需要保持參考線程所以它的確定,每創建一個新的線程的引用將丟失

時間是否確定去做我或我所做的事情d使用不同的技術,如線程池?

+1

我沒有看到單身人士與它有什麼關係。你有一個方法,任何調用它的人都會產生一個新的線程,直到完成爲止。沒關係,只要你不會頻繁地調用它,那你就創建了太多的線程。在這種情況下,線程池是更好的。但是你提供的信息太少,不能給出好的建議,所以請詳細說明一下。 – 2011-12-14 18:59:43

+0

爲什麼你不這樣做: (new Thread(實現Runnable的作業))。start();在你的方法?這應該做到這一點。 – eboix 2011-12-14 19:01:36

回答

3

保留對線程對象的引用並不是絕對必要的,所以如果你不需要它的話,你不需要將它存儲在一個成員變量中;你可以開始線程並忘記參考。

你是否應該使用線程池,取決於你的應用程序到底做了什麼,你希望多久開始一次新線程等等。沒有進一步的信息,很難說這是否值得。如果你這樣做,你會想要使用java.util.concurrent包中的類。使用ExecutorService您可以在線程池中啓動後臺任務。

0

在我看來沒關係。

你在這裏真正面臨的可能是一個不成熟的優化問題。線程多久創建一次?你的應用程序是否會變得足夠忙碌,這會成爲一個問題?在您的目標平臺上,創建新線程需要多少資源和時間,這是否可以接受?

另一個問題是您想跟蹤爲管理(JMX)創建的線程數?

0

主題mSThread被聲明爲類的成員,

你的意思是單身的實例變量?如果是這樣,你可能有問題。更好地使它成爲一個局部變量。

1

線程是運行時的稀缺資源。每次調用方法時產生一個新的代碼都是浪費的 - 尤其是因爲在你的情況下,你所關心的只是調用線程不被阻塞。所以,你應該確保你的方法不會經常被調用。

對於目前的,從評論中,你似乎已經這樣做了。你還應該記錄你的方法不應該過於頻繁地被調用的期望。然而,一些未來的同事可能會意外地錯過這份文件,並將其稱之爲緊密的循環。

爲了防止發生這種情況,您可能需要考慮使用線程池 - 它可以防止未來的意外誤操作 - 尤其是因爲Sun/Oracle提供了令人敬畏的java.util.concurrent包,它可以抽象出大部分混亂的細節。