巨大的CPU影响LinkedBlockingQueue

时间:2012-05-07 15:23:46

标签: java multithreading load cpu

我有一个名为LinkedBlockingQueue的{​​{1}},但当我调用tasks并等待任务可用时,CPU使用率为100%。我使用tasks.take()方法有多个线程(每个线程都有自己的tasks.take()变量)。有人知道为什么会这样吗?

tasks变量

的定义
tasks

执行任务的代码

private LinkedBlockingQueue<ComputerTask> tasks;
// snip
this.tasks = new LinkedBlockingQueue<ComputerTask>(100);

提供新任务的代码

ComputerTask task = tasks.take();

P.S。我不知道这是否是我的Java版本的问题,因为我还没有在任何其他计算机上测试它。

this.tasks.offer(task);

1 个答案:

答案 0 :(得分:2)

我要把我的意见转回答案。

tasks.take();除非要将大量项目出列,否则不应该旋转。如果队列为空,它将阻塞,所以我怀疑这是 100%负载的原因。我会确保您使用分析器或在take()周围添加调试语句,以查看它是否被调用了很多次。

要记住的一件事是,如果队列已满,tasks.offer(task)会立即返回false。我想知道你应该使用tasks.put(task)来阻止而不是旋转。如果您正在使用offer()来确定要运行任务的任务处理程序,那么当所有任务处理程序的队列都已满时,您可能会在周围循环?

如果您正在进行自己的任务管理,则可以考虑使用其中一个内置的ExecutorService类。然后,您可以提交所有任务或使用阻塞队列,ExecutorService将处理为池中的每个线程提供其任务:

// start 10 threads handling the tasks
ExecutorService threadPool = Executors.newFixedThreadPool(10);
// now submit tasks to the pools that will be run with the 10 threads
threadPool.submit(task);
...

在上面的示例中,ComputerTask必须实现Runnable