0

我对这个线程中的提议进行了一些测试: 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 来做到这一点。

有任何想法吗?

问候贝尔纳多

4

0 回答 0