代码之家  ›  专栏  ›  技术社区  ›  6324

当invokeAll()的线程数少于任务数时会发生什么情况?

  •  0
  • 6324  · 技术社区  · 7 年前

    我有以下代码:

    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                                                    10, // corePoolSize
                                                    10, // maximumPoolSize
                                                    10, // keepAliveTime
                                                    TimeUnit.SECONDS, 
                                                    new LinkedBlockingQueue<>()
                                            );
    
    final List<Callable<MyResponse>> tasks = new ArrayList<>();
    final CountDownLatch latch = new CountDownLatch(concurrency);
    
    for (int i = 0; i < 50; i++) {
        tasks.add(() -> {
            latch.countDown();
            latch.await();
    
            return getResponse(); // Returns a MyResponse object.
        });
    }
    
    final List<Future<ThrottleResponse>> futures = threadPoolExecutor.invokeAll(tasks);
    

    这辆车怎么了 invokeAll 方法?这个代码有没有死锁?为什么?我认为 threadPoolExecutor LinkedBlockingQueue 并从队列中轮询以执行任务,所以应该没有死锁,对吗?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Stephen C    7 年前

    您所做的是编写在所有其他任务开始之前无法完成的任务。因为您有10个工人,所以前10个任务都从一个工人开始。。。。然后等待。前10个无法完成,因为他们正在等待其他任务启动,而其他任务无法启动,因为执行者正在等待工作人员自由。。。在前10项任务中的一项完成之前,这是不会发生的。僵局


    我认为threadPoolExecutor会将挂起的任务放在LinkedBlockingQueue中,并从队列中轮询以执行任务,所以应该没有死锁,对吗?

    所有任务都已正确排队。问题在于任务本身在排队后正在做什么;见上面的解释。


    解决:

    • 如果您必须等待其他任务启动,请增加线程池大小,使其足够大以运行所有任务 同时

        2
  •  1
  •   exudong    7 年前