在對象構造函數中啓動線程池安全嗎?我知道你不應該從構造函數中啓動一個線程,關於「this」指針轉義(我不完全明白這一點,但會做一些更多的搜索嘗試找出它)。Java在對象構造函數中啓動線程池
的代碼會是這個樣子:
private ExecutorService pool;
public handler()
{
pool = Executors.newCachedThreadPool();
}
public void queueInstructionSet(InstructionSet set)
{
pool.submit(new Runnable that handles this instruction set);
}
如果不工作,我可以創建這個類作爲一個Runnable並在一個新的線程啓動它。然而,這似乎是在程序中增加了一個不必要的線程,而它並不真正需要它。
謝謝。
編輯:
感謝您的答覆大家,他們一定幫助理解這一點。
按照代碼,在我心中它是有道理的,這個構造函數創建的線程池,但讓我解釋一下具體是什麼這個代碼是幹什麼的,因爲我可以以一種不可思議的方式來思考這個問題。
這個對象的整個的一點是要採取相應的「指令集」對象,並採取行動。指令集來自連接到服務器的客戶端。一旦從客戶端接收到完整指令集,該指令集就被髮送到該對象(處理程序)進行處理。
此處理對象包含到每一個對象,該對象的指令集可根據作用的基準。它會將指令集提交給線程池,該線程池將查找該指令集想要與哪個對象進行交互,然後處理該對象上的指令集。
我能勝任在IO服務器的指令集的對象,但我的想法是有一個單獨的類它使整個代碼更易讀,因爲每個類是專注於做只有一個具體的東西。
想法?建議嗎?
感謝
謝謝,這有幫助。我用這個代碼特別做的更新了OP。我認爲讓構造函數創建線程池是有意義的,但我對此很新,並歡迎任何建議,我可以得到:) – vimalloc 2010-08-16 17:25:13
@kyena:好的,編輯答案。基本上它看起來可能沒問題。你的班級有效*成爲一個線程池(通過組合)。 – 2010-08-16 17:29:40
謝謝!我感謝幫助:) – vimalloc 2010-08-16 17:33:28