【发布时间】:2018-01-05 08:15:53
【问题描述】:
我想知道当使用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) 时,可以按照我的预期获得价值“世界”。 现在我想得到返回值为“hello”,当我使用 future.get(2, TimeUnit.SECONDS) 时。
我该怎么做?谢谢
【问题讨论】:
标签: java future executorservice