3

参考以下代码。

for (Future<Long> future : list) {
            try {
                sum += future.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }

现在当我打电话给 future.get 这会阻塞电话吗?因此,如果我在 Android 应用程序的主线程上执行此操作会导致 ANR 异常吗?我注意到也抛出了 Interrupted 异常,这是否意味着它们是在 get 函数中的线程上调用的睡眠?

4

3 回答 3

6
  1. 是的,文档Future.get()说:

    如有必要,等待计算完成,然后检索其结果。

    因此,它将阻塞,直到计算结果可用,或者计算被中断(取消或导致异常)。

  2. 如果您的计算需要很长时间才能完成,它可能会导致 ANR。

  3. 同样,来自以下文档Future.get()

    @throws InterruptedException 如果当前线程在等待时被中断

    现在,由于您Future.get()从主线程调用,我怀疑是 Android 系统中断了您的主线程以试图使其再次响应。但这也可能是由您的应用程序的另一个线程引起的 - 很难说,因为您没有指定您的应用程序做什么,它创建什么线程,您何时使用 ExecutorService (如果是,哪个实现),等等。

  4. 不,FutureTask.get()(我相信这是Future你正在使用的实现)不调用Thread.sleep(). 相反,将线程置于等待模式是通过线程停放完成的,这会导致它在发出信号之前不会被安排执行。如果在主线程中完成,这可能会导致 ANR 错误。有关parking机制的详细信息,请考虑阅读文档和这个问题

于 2012-12-18T21:35:11.730 回答
0

您可以通过调用 future.isDone() 来简单地检查未来是否“完成”。代码示例:

String result = "";

if (myFuture.isDone()) result = (String) myFuture.get();

您可能希望无限循环地检查它。

于 2017-03-09T16:32:47.747 回答
0

当心与future.get(). 如果MainThread、 that callfuture.get()WorkerThread都是同步的(在同一个对象上),那么你会遇到死锁。

于 2020-10-28T11:56:06.997 回答