gpt4 book ai didi

java - java中导致超时异常时如何获得Future返回

转载 作者:行者123 更新时间:2023-11-30 06:21:13 26 4
gpt4 key购买 nike

我想知道当使用Future和ExecutorService时导致超时异常时我能否得到结果,例如,下面是我的代码

package com.example;

import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.junit.Test;

public class FutureTest {
public static String sayHello() {
try {
Thread.sleep(3000);
return "world";
} catch (Exception e) {
return "hello";
}
}

@Test
public void testTimeoutAndInterrupt() throws Exception {
ExecutorService executorService = new ThreadPoolExecutor(0, Runtime.getRuntime().availableProcessors() * 2, 0,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(10), new BasicThreadFactory.Builder().namingPattern(
"executor-pool-%d").daemon(true).build());

String processName = UUID.randomUUID().toString();

Future<String> future = executorService.submit(
() -> {
return sayHello();
}
);
try {
String result = future.get(2, TimeUnit.SECONDS);
System.out.println("future result:" + result);
} catch (TimeoutException e) {
System.out.println("timeout exception");
} finally {
future.cancel(true);
System.out.println("cancel by future");
}
}
}

当我使用 future.get(5, TimeUnit.SECONDS) 时,可以按照我的预期获取值“world”。现在,当我使用 future.get(2, TimeUnit.SECONDS) 时,我想要得到的返回值为“hello”。

我该怎么做?谢谢

最佳答案

不,该异常不会在执行过程中引发。相反,会抛出InterruptedException。 (在那里尝试 System.out.println)。

控制流程:

    1. 执行超时
  • 线程被中断
  • 3a。抛出 TimeoutException
  • 3b。 FutureTask 收到 InterruptedException

由于 3a 和 3b 在两个线程中发生(异步),因此顺序可能是 3b;3a。然而 3a;3b 似乎是自然顺序。

这样做:

    String result;
try {
result = future.get(2, TimeUnit.SECONDS);
System.out.println("future result:" + result);
} catch (TimeoutException e) {
System.out.println("timeout exception");
result = "hello";
} finally {

注意:我认为 FutureTask 线程不能保证关闭(因为可能没有捕获,即使在捕获之后代码仍会继续)。

使用catch InterruptedException在某个地方存入结果,将会失败,因为在捕获TimeoutException的时刻,FutureTask仍然不会有InterruptedException。

在每个循环步骤中存储进度时,这也是一个陷阱。捕获超时后,进度可能仍会更新。

关于java - java中导致超时异常时如何获得Future返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48109628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com