我有一个名为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);
答案 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
。