Java - 在现有线程上运行runnable?

时间:2012-07-29 23:49:29

标签: java java-ee

我正在尝试从生成的子接口回调切换回现有线程。有谁知道怎么样?回调实现总是从调用它的子线程运行,而不是实现类...

4 个答案:

答案 0 :(得分:5)

你是什么意思转回来?
导致上下文切换将返回到生成子线程的“原始”线程?
如果是这样,这是不可能的。它与多线程概念相矛盾。
如果你想在“原始”线程上完成一些工作,当“子”线程正在运行时,
您可以考虑在子项和原始线程之间建立队列(即 - 生产者/消费者)。
子线程将在队列中放置“作业”,“原始”线程将使用它。
但是,“原始”线程将不得不阻止“子”线程。

实现这一点的另一种方法是使用wait和notify,(子线程将通知) - 但原始线程将再次等待。

最后一种方法是简单地等待子线程执行结束,如果要在子线程执行结束时返回原始线程。 问题是 - 正在等待原始线程在你的场景中是否可以接受?

答案 1 :(得分:2)

你只需要在一个对象上有调用线程wait(),并让子线程notify()成为同一个对象。

调用wait()时,调用线程将停止 调用notify()时,等待的线程将被唤醒并继续。

这些调用必须在synchronized块/方法中进行。

答案 2 :(得分:0)

Swing使用事件调度循环(EDL)的概念,并且所有Swing组件交互必须在EDL的线程上运行。这听起来类似于您想要做的事情,以及他在回复中提出的zaske

您可能会发现以下内容有助于制定解决方案:

答案 3 :(得分:0)

由于这也标记为java-ee,我将提到您不允许在任何Java EE应用服务器中启动线程。它介绍了几个问题:

  • 容易流出线程资源的服务器
  • 可以防止取消部署应用程序
  • 如果线程未标记为守护进程,则可以阻止服务器关闭
  • 失去JNDI,交易,安全等功能

这通常是禁忌。您可以改为查看@Asynchronous注释,它允许您通过容器的协作安全地轻松地进行各种逻辑的分叉/连接。

此答案对@Asynchronous方法的工作原理有一个非常完整的解释,包括示例代码https://stackoverflow.com/a/6158773/190816