【问题标题】:More Threads or Empty Loops?更多线程或空循环?
【发布时间】:2012-02-09 21:36:31
【问题描述】:

在 Java 中,哪个被认为更繁重?实现另一个线程并使用等待通知或在当前线程中合并一个 for/while 循环,类似于此>

while(running){

 //do stuff

   if(skip == 20){

      //do more stuff
      skip = 0;

   }else{
      skip++;
   }
   }

我猜后者不被认为是最佳实践,但我不想最终在一个作用很小的额外线程上花费太多内存。

【问题讨论】:

  • 当您尝试以 100% 的利用率烧毁整个内核时,您是否碰巧注意到计算机上的风扇发出的声音非常响亮?除此之外,假设您在某处睡觉,或者这不是无限循环……线程用于并行化工作。如果您不需要它或它不适用于您的问题,则不要使用其他线程。
  • 为了您的处理器,请使用新线程。你会像这样让这可怜的东西屈服。
  • @BrianRoach 我会把它作为答案 xD(顺便说一句,它的手机,没有冷却风扇)
  • @BrianRoach android 标签和粉丝通常不会聚在一起 :)
  • 噢!错过了。更糟糕的是,你刚刚创造了一个暖手器!

标签: java android multithreading for-loop while-loop


【解决方案1】:

(变成了答案)

假设您在某处处于睡眠状态,或者这不是一个无限循环……线程用于并行化工作;例如您想在两个不同的内核上同时做两件事。如果您不需要它或者它不适用于您的问题,则不要使用其他线程。

如果您没有睡眠或其他阻塞操作并且它是一个无限循环,那么您只是创建了一个暖手器应用程序(或电池消耗应用程序......)

【讨论】:

    【解决方案2】:

    如果这是您需要的流程,即“stuff”和“more stuff”预计不会并行运行,那么计数器/跳过循环就可以了 - 不要接近向其他线程发出信号以运行“more stuff” ' 在每 20 个“东西”之后。

    【讨论】:

    • 是这样吗?其他人说的好像不是这样。这是否取决于有多少“更多的东西”?
    • @KrzysztofKozielczyk 好的,如果我只想延迟,那么线程就是答案?
    • @Jack 抱歉,我同时删除了我的评论。我意识到我并没有真正理解这个问题(我认为它还没有包含足够的数据)。如果do stuff 是需要大量时间的有意义的工作,那么我同意 Martin 的建议并且循环应该没问题。如果它是不需要时间的琐碎代码,那么您将像@BrianRoach 指出的那样创建暖手器。
    【解决方案3】:

    我没有具体的答案,但我想提出一个要遵循的原则。循环的每次迭代都应该包含一个阻塞操作,并且阻塞操作应该有一个超时,这样它就不会永远阻塞。如果您没有任何阻塞操作,您可以使用 sleep(或者更好的是,等待一个超时事件,见下文)。

    如果您想提高打破主循环的责任,请使用事件而不是 bool 标志来控制主循环。这样,当事件发出信号时,循环将立即中断。在伪代码中:

    while(!wait_for(cancelLoopEvent, immediate))
    {
        // do stuff
    
        if(time_to_work())
        {
            // do the work
        }
        else
        {
            wait_for(cancelLoopEvent, loop_timeout)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 2015-06-02
      • 2013-04-13
      相关资源
      最近更新 更多