首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java并发编程--无止境循环

Java并发编程--无止境循环
EN

Stack Overflow用户
提问于 2022-06-01 10:55:03
回答 1查看 71关注 0票数 1

我正在阅读介绍Play Framework: Java应用程序开发(ISBN 978-1-4842-5645-9)的书,下面是关于Callable的示例

代码语言:javascript
复制
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

最后,上述情况将创造一个无止境的循环。

我的假设中是否有任何错误,或者这个例子的作者真的错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-04 12:55:35

如果可调用程序抛出异常,上述程序将永远循环

这是一个具有可调用的代码片段,该代码段会引发异常。永远执行编译过的代码段循环。

代码语言:javascript
复制
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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72460628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档