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()的文档说明:
如有必要,等待计算完成,然后检索其结果
因此,它将阻塞,直到计算结果可用,或者计算被中断(取消或导致异常)
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
都是同步的(在同一个对象上),则会出现死锁