我在此线程中对该提案进行了一些测试: 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秒,然后再继续执行并调用shutdown。通常,它应该在几毫秒内完成,并在打印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可以做到这一点。
有什么想法吗?
问候 贝尔纳多