我对这个线程中的提议进行了一些测试: flux within executorservice
我已经稍微简化了这个例子,以便更容易理解。因此,这是示例:
ExecutorService executorService = Executors.newSingleThreadExecutor();
Flux.just("1", "2", "3").subscribeOn(Schedulers.fromExecutorService(executorService)).doOnNext(System.out::println).subscribe();
try {
executorService.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
executorService.shutdownNow();
}
但是,现在如果执行它,它总是在主线程结束前等待 10 秒。我期待什么?我希望执行程序服务最多等待 10 秒,直到继续并调用关机。通常它应该在几毫秒内完成,并在打印 1、2、3 后立即返回。javadoc 在这里说:
阻塞直到所有任务在关闭请求后完成执行,或者发生超时,或者当前线程被中断,以先发生者为准。
我不明白。这里有什么问题?
另一个立即运行并结束的示例(但在我看来是错误的)是这个:
ExecutorService executorService = Executors.newSingleThreadExecutor();
Flux.range(1, 1_000_000).subscribeOn(Schedulers.fromExecutorService(executorService)).doOnNext(System.out::println).subscribe();
executorService.shutdownNow();
但是,在这里我希望主线程不会等到通量完成(分别是执行程序服务)。但确实如此。据我了解,根据 javadoc 描述,这两个示例的行为完全颠倒了。javadoc 说:
此方法不等待主动执行的任务终止。使用 awaitTermination 来做到这一点。
有任何想法吗?
问候贝尔纳多