【发布时间】:2015-03-12 15:27:31
【问题描述】:
我知道CompletableFuture 设计不会通过中断来控制其执行,但我想你们中的一些人可能会遇到这个问题。 CompletableFutures 是编写异步执行的非常好的方法,但是如果您希望在取消未来时中断或停止底层执行,我们该怎么做呢?或者我们必须接受任何取消或手动完成的CompletableFuture 不会影响在那里完成它的线程?
在我看来,这显然是一项无用的工作,需要 executor worker 的时间。我想知道在这种情况下哪种方法或设计可能会有所帮助?
更新
这是一个简单的测试
public class SimpleTest {
@Test
public void testCompletableFuture() throws Exception {
CompletableFuture<Void> cf = CompletableFuture.runAsync(()->longOperation());
bearSleep(1);
//cf.cancel(true);
cf.complete(null);
System.out.println("it should die now already");
bearSleep(7);
}
public static void longOperation(){
System.out.println("started");
bearSleep(5);
System.out.println("completed");
}
private static void bearSleep(long seconds){
try {
TimeUnit.SECONDS.sleep(seconds);
} catch (InterruptedException e) {
System.out.println("OMG!!! Interrupt!!!");
}
}
}
【问题讨论】:
-
我想知道我们是否可以实现类似它的静态方法 supplyAsync 但有一些额外的逻辑来检查它的完成或取消是否会中断它正在执行的任务线程...
-
请查看我对相关问题的回答:stackoverflow.com/questions/23301598/… 在那里提到的代码中,CompletionStage 行为被添加到 RunnableFuture 子类(由 ExecutorService 实现使用),因此您可以以正确的方式中断它。
标签: java concurrency completable-future