Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Future.get是阻塞吗?_Android_Executorservice - Fatal编程技术网

Android Future.get是阻塞吗?

Android Future.get是阻塞吗?,android,executorservice,Android,Executorservice,参考以下代码 for (Future<Long> future : list) { try { sum += future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.

参考以下代码

for (Future<Long> future : list) {
            try {
                sum += future.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
for(未来:列表){
试一试{
sum+=future.get();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
}
现在,当我给future打电话时,这会是一个阻塞呼叫吗?所以,如果我在android应用程序的主线程上执行此操作,这会导致ANR异常吗?我注意到中断的异常也被抛出,那么这是否意味着它们是在get函数中的线程上调用的睡眠

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

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

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

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

  • 同样,从
    Future.get()的文档中:

    @如果当前线程在等待时被中断,则引发InterruptedException

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

  • 不,
    FutureTask.get()
    (我相信这是您正在使用的
    Future
    的实现)不调用
    Thread.sleep()
    。相反,将线程置于等待模式是通过线程驻车来完成的,这会导致在给出信号之前不会安排线程执行。如果在主线程中执行,这可能会导致ANR错误。详细说明<代码>停车>代码>机制考虑阅读文档和


  • 您只需调用future.isDone()检查future是否“完成”。代码示例:

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

    您可能需要在一个无休止的循环中检查它。

    注意使用
    future.get()
    的死锁。如果调用
    future.get()
    main线程和
    WorkerThread
    都是同步的(在同一个对象上),则会出现死锁