不太抽象的AbstractExecutorService

时间:2017-05-10 16:53:00

标签: java executorservice java.util.concurrent

我偶尔发现自己需要在某个任意线程上运行代码或将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或与GuavaVavr中的有用API进行任何互动。

AbstractExecutorService提供了将单抽象方法Executor引导到完整ExecutorService所需的一些但不是全部方法。具体来说,它缺少shutdown()shutdownNow()isShutdown()isTerminated()awaitTermination()

我可以编写自己的实现(and have),但我更喜欢现有的,经过良好测试的库类(甚至可以选择具有不同性能特征或关闭保证的库)。有什么相似的吗?

N.b。这不是关于Swing或JavaFX的问题;这些只是可能需要从任意线程或类似Executor的任务运行器引导到完整ExecutorService的情况的示例。如果您对这些框架的错误方法有具体的建议,我很感激,但请将其作为评论而不是答案。

1 个答案:

答案 0 :(得分:0)

如果你的目标是JavaFX,你可以试试JRebirth应用程序框架,它提供了对线程和内存问题的真正抽象。

无需操纵未来,每个异步任务都使用内部事件总线处理(发送和处理内部消息)。 在场景后面,它使用2个线程池来执行runnable,但也允许将任务运行到图形线程或内部消息传递线程中。

更容易学习这种方法是阅读源代码:

文档的一些链接: