如何中断CompletableFuture的基础执行

我知道CompletableFuture设计不能通过中断来控制其执行,但是我想其中有些人可能会遇到此问题。CompletableFutures是组成异步执行的一种非常好的方法,但是考虑到当您希望取消future时中断或停止基础执行时,我们该怎么做?还是我们必须接受,任何取消或手动完成的操作CompletableFuture都不会影响正在执行该操作的线程?

我认为,那显然是一项无用的工作,需要花费执行者的时间。我想知道在这种情况下哪种方法或设计可能会有所帮助?

这是一个简单的测试

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!!!");

}

}

}

回答:

A

CompletableFuture与可能最终完成的异步操作无关。

由于(与FutureTask此类不同)此类无法直接控制导致其完成的计算,因此取消被视为异常完成的另一种形式。方法cancel的作用与相同completeExceptionally(new

CancellationException())

有可能甚至 一个单独的线程上完成它的工作(甚至有可能是 许多

线程在它的工作)。即使存在,也没有从CompletableFuture到任何引用它的线程之间的链接。

因此,您无法执行CompletableFuture任何操作来中断可能正在运行某些任务的线程来完成该任务。您必须编写自己的逻辑,该逻辑跟踪所有Thread获取到的引用的实例CompletableFuture以完成该实例。


这是我认为您可以摆脱的执行类型的示例。

public static void main(String[] args) throws Exception {

ExecutorService service = Executors.newFixedThreadPool(1);

CompletableFuture<String> completable = new CompletableFuture<>();

Future<?> future = service.submit(new Runnable() {

@Override

public void run() {

for (int i = 0; i < 10; i++) {

if (Thread.interrupted()) {

return; // remains uncompleted

}

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

return; // remains uncompleted

}

}

completable.complete("done");

}

});

Thread.sleep(2000);

// not atomic across the two

boolean cancelled = future.cancel(true);

if (cancelled)

completable.cancel(true); // may not have been cancelled if execution has already completed

if (completable.isCancelled()) {

System.out.println("cancelled");

} else if (completable.isCompletedExceptionally()) {

System.out.println("exception");

} else {

System.out.println("success");

}

service.shutdown();

}

这假定已将正在执行的任务设置为正确处理中断。

以上是 如何中断CompletableFuture的基础执行 的全部内容, 来源链接: utcz.com/qa/423450.html

回到顶部