android - Future.get 阻塞了吗?

标签 android executorservice

引用以下代码。

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 函数中的线程上调用的 sleep ?

最佳答案

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

    Waits if necessary for the computation to complete, and then retrieves its result.

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

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

  3. 同样,来自 Future.get() 的文档:

    @throws InterruptedException if the current thread was interrupted while waiting

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

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

关于android - Future.get 阻塞了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12878159/

相关文章:

java - ArrayList<Integer> 如何在下面的程序中存储 'null' 值?

java - ExecutorService调用所有线程池问题

java - 在 Canvas 上循环绘制文本

android - 我需要做什么才能在 Visual Studio 2010 中编译 Android NDK (C++) aps?

php - 从mysql数据库获取BLOB到android

Java - 如何同步和并行调用返回字符串的函数?

java - 如何从“设置 Activity ”修改“MainActivity”上的数据?

android - 将视频从android流式传输到桌面

Java 执行器调用外部可执行文件的速度仅稍快一些

java - 如何保持 executorService 运行?