我对Java中的Threads很新,我正在使用一个内部使用线程并从对方收听数据的API,我将这些数据放入队列中进行进一步处理。我创建了另一个Thread,它不断读取此队列以检索数据和处理,并将结果写入文本文件。我正在使用while(true)语句在线程中运行无限循环这会导致百分之百的CPU使用率,如果我使用sleep(10),它会增加延迟,随着时间的推移不断增加,因为我收到大约20个数据项一秒钟。
public void run() {
while(true) {
try { Thread.sleep(10); }
catch (InterruptedException e2) { // TODO Auto-generated catch block
e2.printStackTrace();
}
if (!(queue.isEmpt())) {
Tick quote=queue.take();
processTuple(quote);
}
} // end while(true)
} // end run()
任何人都可以向我建议解决方案,我可以在不增加延迟的情况下降低CPU使用率。
答案 0 :(得分:3)
修改强>:
如何根据代码使用队列的示例:
LinkedBlockingQueue<Tick> queue;
public void run() {
while (true) {
// No need to check the queue. No need to sleep().
// take() will wait until there's anything available
Tick quote = queue.take();
processTuple(quote);
}
}
答案 1 :(得分:2)
雅。使用BlockingQueue
实施代替 busy- wait 。 while(true)
将继续安排线程。
答案 2 :(得分:0)
使用queue
实施代替Threads
。请参阅this link以了解有关队列实施的更多信息。您可以使用ArrayBlockingQueue
。
答案 3 :(得分:0)
您可以更改以下代码:
BlockingQueue<Tick> queue = ..
public void run()
{
for (Tick quote; quote = queue.take(); )
{
if (quote == someSpecialObjectToIndicateStop)
break; // To stop this thread Or you may catch InterruptedException
processTuple(quote);
}
}
请参阅BlockingQueue文档here