小编pla*_*ino的帖子

Executor中出现意外死锁

我在ThreadPoolExecutor中运行任务时发现了意外的死锁.

这个想法是一个主要任务,它启动一个改变标志的次要任务.主任务暂停,直到辅助任务更新标志.

  • 如果corePoolSize> = 2,则主任务按预期完成.
  • 如果corePoolSize <2,那么次要任务似乎已被强制但从未启动.
  • 相反,使用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");
          }
       }; …
    Run Code Online (Sandbox Code Playgroud)

java concurrency deadlock executorservice threadpool

2
推荐指数
1
解决办法
779
查看次数