gpt4 book ai didi

java - FutureTask 中提交给 ExecutorService 的“Park”相关死锁(在 Android 中)

转载 作者:行者123 更新时间:2023-12-01 13:49:16 25 4
gpt4 key购买 nike

我有以下形式的代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com