2013-02-08 94 views
0

如何確保在主線程的上下文中調用回調?我正在嘗試瞭解如何確保在創建activemq使用者的線程的上下文中執行回調。Java線程回調線程上下文

我在偵聽器/處理程序中獲得的線程ID與創建使用者並設置偵聽器的線程ID不同,所以我想了解如何確保處理程序/偵聽器中的代碼能夠在第一個線程線程。

如果我創建了在偵聽器中運行代碼的線程,我可能會使用Executor和Future,但是由於它是由activemq爲我創建的,我希望弄清楚如何讓偵聽器執行在「主」線程的上下文中。

然後我開始閱讀關於java線程回調的一般信息,大多數文章都解釋了調用一個方法來傳遞給實現可運行的線程的類。在我看來,該回調中的任何代碼仍將在我剛剛產生的線程的上下文中。

..我如何確保在主線程的上下文中調用回調?

在.NET中,我可以使用的SynchronizationContext或WPF它使用引擎蓋下此背景下,調度..

我一直在尋找的同步方法,但它看起來像另一個定義這些方法獲得的數據變量線程,即'主'線程,在我的情況下,變量/數據在消費者線程中創建,我需要將它們傳回/確保它們在'主'線程上可用。

回答

0

有趣的問題。我要做的第一件事是確保我知道哪個線程正在執行。一個簡單的方法是將此打印語句放在回調中: System.out.println(Thread.currentThread());

現在儘可能在特定的線程上運行一個方法:不要這麼想。獲取線程的上下文不是Java的一部分。與.Net不同,JVM可能由不同的公司編寫。 IBM是非常好的一個。來自Oracle的JRocket是另一個。因此,在引擎蓋下並不容易。

我會捅一些,讓你知道如果找到。

+0

謝謝,我的意思是它本身並不是一個問題,當結果回到不同的線程時,它更正確地執行工作。我問的原因有兩個:1,我不想用應該在另一個線程上完成的工作壓倒消費者線程,讓消費者專注於傳入的消息,以及2誰應該編排下一步該做什麼以及在哪裏它被執行。我認爲主線程會對此負責,產生另一個線程來執行工作,並傳遞從消費者線程接收到的結果。 – DanBo

+0

也許這是一個壞主意,因爲主線程可能仍然忙於做某些事情,並阻止消費者線程,因爲它還沒有準備好接收結果。 – DanBo

+0

你可以讓你的回調邏輯啓動一個新的線程或喚醒現有的工作線程來完成繁重的工作。我使用過這種技術。 – edharned