【发布时间】:2014-03-29 04:45:57
【问题描述】:
我在 ThreadPoolExecutor 中运行任务时发现意外死锁。
这个想法是一个主要任务,它启动一个改变标志的次要任务。 主要任务暂停,直到次要任务更新标志。
- 如果 corePoolSize >=2,则主要任务按预期完成。
- 如果 corePoolSize
- 改用 SynchronousQueue,即使 corePoolSize=0,主任务也会完成。
我想知道:
- 什么是死锁的原因?从图上看似乎不明显 文档。
- 为什么使用 SynchronousQueue 而不是 LinkedBlockingQueue 可以防止死锁?
-
corePoolSize =2 是防止这种死锁的安全值吗?
import java.util.concurrent.*; class ExecutorDeadlock { /*------ FIELDS -------------*/ boolean halted = true; ExecutorService executor; Runnable secondaryTask = new Runnable() { public void run() { System.out.println("secondaryTask started"); halted = false; System.out.println("secondaryTask completed"); } }; Runnable primaryTask = new Runnable() { public void run() { System.out.println("primaryTask started"); executor.execute(secondaryTask); while (halted) { try { Thread.sleep(500); } catch (Throwable e) { e.printStackTrace(); } } System.out.println("primaryTask completed"); } }; /*-------- EXECUTE -----------*/ void execute(){ executor.execute(primaryTask); } /*-------- CTOR -----------*/ ExecutorDeadlock(int corePoolSize,BlockingQueue<Runnable> workQueue) { this.executor = new ThreadPoolExecutor(corePoolSize, 4,0L, TimeUnit.MILLISECONDS, workQueue); } /*-------- TEST -----------*/ public static void main(String[] args) { new ExecutorDeadlock(2,new LinkedBlockingQueue<>()).execute(); //new ExecutorDeadlock(1,new LinkedBlockingQueue<>()).execute(); //new ExecutorDeadlock(0,new SynchronousQueue<>()).execute(); } }
【问题讨论】:
标签: java concurrency threadpool deadlock executorservice