我偶尔发现自己需要在某个任意线程上运行代码或将Runnable传递给某个任意使用者,并且缺少java.util.concurrent的全部功能 - 例如,编写Swing和JavaFX应用程序,发布UI更新来自使用SwingUtilities.invokeLater()或Platform.runLater()的主要UI主题线程的后台主题。
在Executor:
中包装这样的API很容易class AppThreadExecutor implements Executor {
@Override
public void execute(Runnable command) {
if (Platform.isFxApplicationThread()) {
command.run();
} else {
Platform.runLater(command);
}
}
}
然而,这并没有真正让你受益匪浅;特别是,它不会让您Futures
或与Guava或Vavr中的有用API进行任何互动。
AbstractExecutorService提供了将单抽象方法Executor引导到完整ExecutorService所需的一些但不是全部方法。具体来说,它缺少shutdown()
,shutdownNow()
,isShutdown()
,isTerminated()
和awaitTermination()
。
我可以编写自己的实现(and have),但我更喜欢现有的,经过良好测试的库类(甚至可以选择具有不同性能特征或关闭保证的库)。有什么相似的吗?
N.b。这不是关于Swing或JavaFX的问题;这些只是可能需要从任意线程或类似Executor的任务运行器引导到完整ExecutorService的情况的示例。如果您对这些框架的错误方法有具体的建议,我很感激,但请将其作为评论而不是答案。
答案 0 :(得分:0)
如果你的目标是JavaFX,你可以试试JRebirth应用程序框架,它提供了对线程和内存问题的真正抽象。
无需操纵未来,每个异步任务都使用内部事件总线处理(发送和处理内部消息)。 在场景后面,它使用2个线程池来执行runnable,但也允许将任务运行到图形线程或内部消息传递线程中。
更容易学习这种方法是阅读源代码:
文档的一些链接: