作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下形式的代码:
ExecutorService execSvc = Executors.newFixedThreadPool(10);
...
execSvc.execute(new Runnable() {
@Override
public void run() {
Thread.currentThread().setName("Wonky");
try {
//here is reached
doSomethingWith(mSomeFutureTask.get());
//here is never reached
} catch (InterruptedException e) {
...
}
});
为了测试目的,我还将 mSomeFutureTask
简化为一个纯粹的 stub ,有点像这样:
mSomeFutureTask = new FutureTask<Object>(new Callable<Object> {
public Object call() {
return null;
}
});
但是线程“Wonky”永远不会从 get() 返回。当我暂停 JVM 时,这是该线程的堆栈转储:
Thread [<18> Wonky] (Suspended)
<VM does not provide monitor information>
Object.wait(long, int) line: not available [native method]
Thread.parkFor(long) line: 1231
Unsafe.park(boolean, long) line: 323
LockSupport.park(Object) line: 157
FutureTask$Sync(AbstractQueuedSynchronizer).parkAndCheckInterrupt() line: 813
FutureTask$Sync(AbstractQueuedSynchronizer).doAcquireSharedInterruptibly(int) line: 973
FutureTask$Sync(AbstractQueuedSynchronizer).acquireSharedInterruptibly(int) line: 1282
FutureTask$Sync.innerGet() line: 219
MyOwnClass$SomeFutureTaskClass(FutureTask).get() line: 82
MyOwnClass$Runnable.run() line: 152
Executors$RunnableAdapter.call() line: 442
FutureTask$Sync.innerRun() line: 305
FutureTask.run() line: 137
ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1076
ThreadPoolExecutor$Worker.run() line: 569
Thread.run() line: 856
我不知道它在等待什么。另一个线程中有关于 Park pre-JVM 6u21 的错误实现的讨论。
这带来了另外两个问题——给定的 Android 环境使用什么版本的 Java SDK(如何找到?)以及“JVM 6u21”之间的关系是什么(这是标准还是实现?)和 Dalvik 1.5.0,这是我的设备正在运行的?
最佳答案
您可能从未将 mSomeFutureTask
提交给任何执行程序,因此任务永远不会完成,并且 get()
会永远等待。
关于java - FutureTask 中提交给 ExecutorService 的“Park”相关死锁(在 Android 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20088076/
我是一名优秀的程序员,十分优秀!