我正在阅读介绍Play Framework: Java应用程序开发(ISBN 978-1-4842-5645-9)的书,下面是关于Callable的示例
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableClient {
/**
* @param args
*/
// Step1 : Create a Runnable
public static void main(String[] args) {
Callable callableTask = new CallableTask();
// Step 2: Configure Executor
// Uses FixedThreadPool executor
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<String> future = executor.submit(callableTask);
boolean listen = true;
while (listen) {
if (future.isDone()) {
String result;
try {
result = future.get();
listen = false;
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
executor.shutdown();
}
}我的问题是,如果计算Future while 抛出和异常,while循环会永远运行吗?
在我看来,是的,它将永远循环。
首先,如果Future计算抛出异常,则
future.isDone()总是计算为true。因此,我们到达if的内部,在那里可以设置停止条件。还是没问题。
第二,根据未来的文档,当到达线时
result = future.get();它总是抛出ExecutionException,因为计算抛出了一个异常。此异常在try-catch块中捕获,而不达到停止条件的先决条件,即
listen = false最后,上述情况将创造一个无止境的循环。
我的假设中是否有任何错误,或者这个例子的作者真的错了?
发布于 2022-06-04 12:55:35
如果可调用程序抛出异常,上述程序将永远循环。
这是一个具有可调用的代码片段,该代码段会引发异常。永远执行编译过的代码段循环。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableClient {
public static class CallableTask implements Callable<String> {
@Override
public String call() throws Exception {
throw new Exception();
}
}
public static void main(String[] args) {
Callable<String> callableTask = new CallableTask();
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<String> future = executor.submit(callableTask);
boolean listen = true;
while (listen) {
if (future.isDone()) {
String result;
try {
result = future.get();
listen = false;
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
executor.shutdown();
}
}https://stackoverflow.com/questions/72460628
复制相似问题