2013-08-26 21 views
0

如何在已經啓動的自定義線程中運行代碼?在java中已經啓動的線程中調用代碼

我需要它在EDT-SwingUtilities.invokeLater()Android.view.runOnUIThread()這樣的啓動線程中運行代碼。

謝謝!

+0

這不是馬上可能的。你能舉一個你想要的行爲的例子嗎? –

回答

2

如果您希望能夠在不接受執行任務的線程上執行此操作,那麼答案很簡單:您要求的是不可能的。實現這一目標的唯一方法是通過您想要執行此操作的線程進行明確的合作。

如果上面的段落沒有阻止你,那麼最好的選擇是使用ExecutorService並向它提交任務。如果這是您的目標,則該服務可以配置爲單線程。

7

簡而言之,您的特殊線程需要保持一個要運行的任務隊列,然後等待任務添加到該隊列中。當任務出現時,它應該運行任務,然後返回並等待更多。確保使用正確的同步來保護該隊列,因爲它將被多個線程訪問。並且要非常小心,例外情況不會意外終止您的循環。

這當然正是用戶界面的事件分派器線程所做的。

+1

這聽起來像很多重新實現'Timer'或'ExecutorService'的工作:) –

+1

確實,在實際的生產代碼中,它使用'ExecutorService.'是有道理的。但是,有些人應該學習這個東西作品 - 我不喜歡看到人們使用類似於「ExecutorService」的東西,因爲他們認爲這是神奇的,而且這是做事的唯一方法。 –

+0

您是否可以解釋一個快速算法或任何資源來實現ExecutorService以加入自定義線程內的代碼?我試圖實現它。 – iberck