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