1

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

4

4 回答 4

5

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

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

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

于 2012-07-30T00:19:03.340 回答
2

您只需将调用线程wait()放在一个对象上,并让子线程notify()具有相同的对象。

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

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

于 2012-07-30T00:23:41.870 回答
0

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

  • 容易流血服务器的线程资源
  • 可以防止应用程序的卸载
  • 如果线程未标记为守护进程,则可以防止服务器关闭
  • JNDI、事务、安全等功能的丢失

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

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

于 2012-08-03T04:58:00.187 回答
0

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

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

于 2012-08-03T04:04:57.160 回答