2013-02-08 53 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