我正在尝试从生成的子接口回调切换回现有线程。有谁知道怎么样?回调实现总是从调用它的子线程运行,而不是实现类...
答案 0 :(得分:5)
你是什么意思转回来?
导致上下文切换将返回到生成子线程的“原始”线程?
如果是这样,这是不可能的。它与多线程概念相矛盾。
如果你想在“原始”线程上完成一些工作,当“子”线程正在运行时,
您可以考虑在子项和原始线程之间建立队列(即 - 生产者/消费者)。
子线程将在队列中放置“作业”,“原始”线程将使用它。
但是,“原始”线程将不得不阻止“子”线程。
实现这一点的另一种方法是使用wait和notify,(子线程将通知) - 但原始线程将再次等待。
最后一种方法是简单地等待子线程执行结束,如果要在子线程执行结束时返回原始线程。
问题是 - 正在等待原始线程在你的场景中是否可以接受?
答案 1 :(得分:2)
你只需要在一个对象上有调用线程wait()
,并让子线程notify()
成为同一个对象。
调用wait()
时,调用线程将停止
调用notify()
时,等待的线程将被唤醒并继续。
这些调用必须在synchronized
块/方法中进行。
答案 2 :(得分:0)
Swing使用事件调度循环(EDL)的概念,并且所有Swing组件交互必须在EDL的线程上运行。这听起来类似于您想要做的事情,以及他在回复中提出的zaske
。
您可能会发现以下内容有助于制定解决方案:
SwingUtilities
,特别是invokeLater(Runnable)
方法。SwingWorker
如果你想得到更多想法并开始更多线程。答案 3 :(得分:0)
由于这也标记为java-ee
,我将提到您不允许在任何Java EE应用服务器中启动线程。它介绍了几个问题:
这通常是禁忌。您可以改为查看@Asynchronous
注释,它允许您通过容器的协作安全地轻松地进行各种逻辑的分叉/连接。
此答案对@Asynchronous
方法的工作原理有一个非常完整的解释,包括示例代码https://stackoverflow.com/a/6158773/190816