java程序在线程中的无限循环导致百分之百的CPU

时间:2015-04-20 10:35:24

标签: java loops

我对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使用率。

4 个答案:

答案 0 :(得分:3)

查看ArrayBlockingQueue

修改

如何根据代码使用队列的示例:

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