Java DeleverableFuture不取消基础执行

发布于 2025-01-26 09:32:30 字数 1598 浏览 5 评论 0原文

我希望从以下代码中,由于超时,完整的图将停止处理。但是我可以看到,取消没有效果。

public class CompletableFutureTest {

    public static void main(final String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(10);
        CompletableFuture completableFuture;
        CompletableFuture completableFuture2;
        completableFuture =
                CompletableFuture.runAsync(() -> callSomeMethod(1), executor);
        completableFuture2 =
                CompletableFuture.runAsync(() -> callSomeMethod(2), executor);
        try {

            System.out.println("After everything");
            completableFuture.get(2, TimeUnit.SECONDS);
            completableFuture2.get(2, TimeUnit.SECONDS);
        } catch (ExecutionException e) {
            cancelCompletableFuture(completableFuture);
            cancelCompletableFuture(completableFuture2);
        }  catch (TimeoutException e) {
            cancelCompletableFuture(completableFuture);
            cancelCompletableFuture(completableFuture2);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

    }

    private static void callSomeMethod(int i) {
        System.out.println("In some method" + i);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            System.out.println("Interrupted");
        }
        System.out.println("After sleep" + i);
    }

    private static void cancelCompletableFuture(CompletableFuture completableFuture) {
        completableFuture.cancel(true);
    }


}

我可以看到2个完整的期货仍在运行。

I am expecting that from the below code, due to timeouts the completablefutures will stop processing. But I can see that that cancel has no effect.

public class CompletableFutureTest {

    public static void main(final String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(10);
        CompletableFuture completableFuture;
        CompletableFuture completableFuture2;
        completableFuture =
                CompletableFuture.runAsync(() -> callSomeMethod(1), executor);
        completableFuture2 =
                CompletableFuture.runAsync(() -> callSomeMethod(2), executor);
        try {

            System.out.println("After everything");
            completableFuture.get(2, TimeUnit.SECONDS);
            completableFuture2.get(2, TimeUnit.SECONDS);
        } catch (ExecutionException e) {
            cancelCompletableFuture(completableFuture);
            cancelCompletableFuture(completableFuture2);
        }  catch (TimeoutException e) {
            cancelCompletableFuture(completableFuture);
            cancelCompletableFuture(completableFuture2);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

    }

    private static void callSomeMethod(int i) {
        System.out.println("In some method" + i);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            System.out.println("Interrupted");
        }
        System.out.println("After sleep" + i);
    }

    private static void cancelCompletableFuture(CompletableFuture completableFuture) {
        completableFuture.cancel(true);
    }


}

I can see the 2 completable futures still running.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

女皇必胜 2025-02-02 09:32:30

完整future的Javadoc具有您的问题的答案,特别是MayInterruptIfrunning CANCE> CANCEL> CANCEL方法的评论:

MayInterruptifrunning - 此值在此实现中无效,因为中断不用于控制处理。

The javadoc for CompletableFuture has the answer to your question, specifically the comment for the mayInterruptIfRunning parameter of the cancel method:

mayInterruptIfRunning – this value has no effect in this implementation because interrupts are not used to control processing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文