【发布时间】:2021-06-25 09:57:14
【问题描述】:
在 Joshua Bloch 的《Effective Java》一书中,有这个例子(第 81 项):
// Simple framework for timing concurrent execution
public static long time(Executor executor, int concurrency,
Runnable action) throws InterruptedException {
CountDownLatch ready = new CountDownLatch(concurrency);
CountDownLatch start = new CountDownLatch(1);
CountDownLatch done = new CountDownLatch(concurrency);
for (int i = 0; i < concurrency; i++) {
executor.execute(() -> {
ready.countDown(); // Tell timer we're ready
try {
start.await(); // Wait till peers are ready
action.run();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
done.countDown(); // Tell timer we're done
}
});
}
ready.await(); // Wait for all workers to be ready
long startNanos = System.nanoTime();
start.countDown(); // And they're off!
done.await(); // Wait for all workers to finish
return System.nanoTime() - startNanos;
}
然后它说:
传递给time方法的executor必须 允许创建至少与给定并发级别一样多的线程,或者 测试永远不会完成。这被称为线程饥饿死锁 [Goetz06, 8.1.1]。
我不知道为什么这会死锁,例如有 1 个线程和两个任务。你有一个可能导致死锁的例子吗?
【问题讨论】:
标签: java multithreading parallel-processing deadlock synchronized