完成所有提交的任务后关闭Java执行程序而不会阻塞

zuc*_*ori 4 java executorservice scheduledexecutorservice java-threads

我想知道是否有办法关闭Java ExecutorService并允许所有提交的任务完成而不阻塞.

更具体地说,我想安排一个Runnable延迟并继续使用代码,而不需要保持ExecutorService对能够关闭它的引用.

以下代码将终止提交的任务,因为它尚未启动:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(runnable, delay, TimeUnit.MILLISECONDS);
executor.shutdown();
...
Run Code Online (Sandbox Code Playgroud)

虽然此代码将阻塞,直到任务完成:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(runnable, delay, TimeUnit.MILLISECONDS);
executor.awaitTermination(timeout, TimeUnit.MILLISECONDS);
...
Run Code Online (Sandbox Code Playgroud)

我想要这样的东西:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(runnable, delay, TimeUnit.MILLISECONDS);
executor.shutdownAfterTerminationWithoutBlocking();
...
code that runs without waiting
Run Code Online (Sandbox Code Playgroud)

我知道这可能使用,Timer但我想知道这是否可能使用ExecutorService

Nik*_*kem 5

ExecutorService.shutdown javadoc说:

启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务.

因此,已经提交但尚未开始的任务将被执行.正是你需要的.