小编xpa*_*492的帖子

当提交足够的任务时,修复了线程池线程阻塞

我有一个需要并行计算许多小任务的过程,然后按照任务的自然顺序处理结果.为此,我有以下设置:

一个简单的ExecutorService和一个阻塞队列,我将使用它来保持在将Callable提交给执行程序时返回的Future对象:

ExecutorService exec = Executors.newFixedThreadPool(15);
LinkedBlockingQueue<Future<MyTask>> futures = new LinkedBlockingQueue<Future<MyTask>>(15 * 64);
Run Code Online (Sandbox Code Playgroud)

一些调试代码用于计算已提交的数量和已处理任务的数量,并定期将其写出(请注意,processed在任务代码本身的末尾会增加):

AtomicLong processed = new AtomicLong(0);
AtomicLong submitted = new AtomicLong(0);

Timer statusTimer = new Timer();
statusTimer.schedule(new TimerTask() {
      @Override
      public void run() {
        l.info("Futures: " + futures.size() + "; Submitted: " + submitted.get() + "; Processed: " + processed.get() + "; Diff: " + (submitted.get() - processed.get())));
      }             
}, 60 * 1000, 60 * 1000);
Run Code Online (Sandbox Code Playgroud)

从队列(实际上是生成器)获取任务并将它们提交给执行程序的线程,将生成的Future放入futures队列中(这就是我确保不提交太多任务的内存耗尽):

Thread submitThread = new Thread(() -> …
Run Code Online (Sandbox Code Playgroud)

java multithreading threadpool

7
推荐指数
1
解决办法
1532
查看次数

标签 统计

java ×1

multithreading ×1

threadpool ×1