我在ThreadPoolExecutor中运行任务时发现了一个意外的死锁。Executor中的意外死锁
这个想法是启动改变标志的辅助任务的主要任务。 主任务暂停,直到辅助任务更新标志。
- 如果corePoolSize> = 2,则主任务按预期完成。
- 如果corePoolSize < 2似乎是次要任务是enquenqued但从未启动。
- 改为使用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(); } }
你的意思是corePoolSize包括任务来管理队列? – plastilino
它指定执行程序线程数 – Antoniossss
对不起,我无法得到它。最多允许4个线程共存。并且还有SyncQueue情况... – plastilino