【问题标题】:java program a infinite loop in thread cause hundred percent cpujava程序线程中的无限循环导致百分之百的cpu
【发布时间】:2015-06-27 00:54:03
【问题描述】:

我对 Java 中的线程很陌生,我正在使用一个 API,它在内部使用线程并侦听来自对方的数据,我将这些数据放入队列中以供进一步处理。我创建了另一个线程,它不断读取此队列以检索数据和处理并将结果写入文本文件。我正在使用 while(true) 语句在线程中运行无限循环,这会导致 100% 的 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 使用率的解决方案。

【问题讨论】:

  • 显示代码以提供帮助..
  • 以下是我的运行方法代码
  • public void run() { while(true) { try { Thread.sleep(10); } catch (InterruptedException e2) { // TODO 自动生成的 catch 块 e2.printStackTrace(); } if (!(queue.isEmpt())) { 勾选报价=queue.take(); processTuple(报价); } } // 结束 while(true) } // 结束 run()
  • @Zafar Iqbal:编辑你的问题并在其中插入代码,缩进4个空格,这样会更容易阅读。

标签: java loops


【解决方案1】:

查看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);
    } 
}

【讨论】:

    【解决方案2】:

    您可以像这样更改您的代码:

    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

    【讨论】:

      【解决方案3】:

      使用queue 实现而不是Threads。请参阅this link 以了解有关队列实现的更多信息。你可以使用ArrayBlockingQueue

      【讨论】:

      • 对不起,我没有到这里...请您给我更多提示...。如何在不使用线程中的 while(true) 语句的情况下连续读取队列。请多多指教
      • 这里不要使用线程。不过,您必须使用 white true 。队列有一定的方法来检查它是满的还是空的。您可以看到如何使用消费和生产方法来操作队列。 github.com/jeevan-patil/thread/blob/master/src/org/thread/…
      • @Jeevan Patil 웃:为什么说“不要使用线程”?对我来说,这就是排队的意义所在。您指向的示例使用线程。
      • @RogerGustavsson OP 说他正在使用线程不断地从队列中读取数据。我们不需要线程来做到这一点。简单的 while(true) 循环可以做到这一点。
      • @Jeevan Patil 웃:最少是一个线程从队列中读取(使用)。从这个意义上说,您不需要线程,但您需要另一个线程来生成队列。最有可能的是,你有不止一个消费者,我猜这就是 OP 正在做的事情。他仍然需要线程。不过,每个线程通常都需要一个 while(true) 循环。然而,OP 的问题是对队列的误用。将我编辑的答案中的代码与 OP 的代码进行比较。
      【解决方案4】:

      是的。使用BlockingQueue 实现而不是busy-waitwhile(true) 将继续调度线程。

      【讨论】:

      • 我已经在使用 LinkedBlockingQueue 类型的队列。抱歉,我没有到这里...您能否给我更多提示...。如何在不使用线程中的 while(true) 语句的情况下连续读取队列。请多多指教
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 2011-11-14
      • 2014-08-02
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      相关资源
      最近更新 更多