0

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

tasks变量的定义

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

执行任务的代码

ComputerTask task = tasks.take();

提供新任务的代码

this.tasks.offer(task);

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

java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-413-11M3623)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-413, mixed mode)
4

1 回答 1

3

我有一个LinkedBlockingQueue被调用的任务,但是当我调用tasks.take()并等待任务可用时,CPU 使用率为 100%。我有多个线程使用该tasks.take()方法(每个线程都有自己的任务变量)。

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

要记住的一件事是,如果队列已满,则立即tasks.offer(task)返回。false我想知道您应该使用tasks.put(task)which 将阻止而不是旋转。如果您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.

于 2012-05-07T16:02:07.043 回答