可调用而不是可运行,所以我不需要抓住

时间:2019-07-15 13:05:47

标签: java callable

我通过以下方式定义了Future:

        Future<?>       future  = null;
        ExecutorService service = null;

首先我用过(只是为了了解这些东西而玩):

            future = service.submit(() -> {
                    for (int i = 0; i < 5; ++i) {
                        System.out.println("Printing record old: " + i);
                        try {
                            Thread.sleep(5);
                        } catch (InterruptedException e) {
                            // Ignore
                        }
                    }
                });

但是我真的不喜欢try catch部分,因此我将其重写为:

            future = service.submit(() -> {
                    for (int i = 0; i < 5; ++i) {
                        System.out.println("Printing record: " + i);
                        Thread.sleep(5);
                    }
                    return "Done";
                });

通过这种方式,可以使用Callable而不是Runnable,而且我不需要捕获。但是我返回了一个未使用的值。
可以这样做吗?还是有更好的方法?

2 个答案:

答案 0 :(得分:1)

这是因为方法语法

Runnable Runnablerun方法不会引发任何异常,因此您需要使用try catch处理任何已检查的异常

void run()

Callable但是Callablecall方法抛出Exception,因此您可以使用try catch进行处理,也可以离开JVM

V call() throws Exception

答案 1 :(得分:0)

使用Callable时,如果引发异常,则在调用future.get()时会得到ExecutionException

此异常将包装您的可调用对象引发的异常,并且可以由getCause()

访问

在此处查看更多信息:https://www.baeldung.com/java-runnable-callable

因此,您并没有真正避免尝试/捕获,只需将其移动到其他地方(这很有意义-您需要在某个地方处理它...)