Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更多线程还是空循环?_Java_Android_Multithreading_For Loop_While Loop - Fatal编程技术网

Java 更多线程还是空循环?

Java 更多线程还是空循环?,java,android,multithreading,for-loop,while-loop,Java,Android,Multithreading,For Loop,While Loop,在Java中,哪一项被认为更为繁重?实现另一个线程并在当前线程内使用wait notify或合并for/while循环,类似于此> while(running){ //do stuff if(skip == 20){ //do more stuff skip = 0; }else{ skip++; } } 我猜后者不被认为是最佳实践,但我不想在一个额外的线程上花费太多的内存,而这个线程做的很少。如果这是您需要的流程,即“st

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

while(running){

 //do stuff

   if(skip == 20){

      //do more stuff
      skip = 0;

   }else{
      skip++;
   }
   }

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

如果这是您需要的流程,即“stuff”和“more stuff”预计不会并行运行,然后计数器/跳过循环就可以了-不要在每20次“填充”之后就发送信号给其他线程运行“更多填充”。

(移动到作为答案)

假设你在某处睡觉或者这不是一个无限循环。。。线程用于并行工作;e、 你想在两个不同的核上同时做两件事。如果您不需要它,或者它不适用于您的问题,您就不需要使用额外的线程


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

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

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

while(!wait_for(cancelLoopEvent, immediate))
{
    // do stuff

    if(time_to_work())
    {
        // do the work
    }
    else
    {
        wait_for(cancelLoopEvent, loop_timeout)
    }
}

当你试着用100%的利用率烧掉整个内核时,你有没有注意到你机器上的风扇发出很大的声音?除此之外,假设你在某处睡觉或者这不是一个无限循环。。。线程用于并行工作。如果你不需要它或者它不适用于你的问题,你就不会使用额外的线程。为了你的处理器,使用一个新的线程。你会让这个可怜的家伙像这样跪在地上。@BrianRoach我会把这当作一个答案xD(顺便说一句,它的手机,没有冷却风扇)@BrianRoach android标签和风扇通常不会在一起:)Doh!错过了。更糟糕的是,你刚刚创造了一个暖手器!是这样吗?其他人似乎不是这么说的。这取决于有多少“更多的东西”吗?@KrzysztofKozielczyk好的,如果我只是想延迟一下,那么线程就是答案吗?@Jack抱歉,我同时删除了我的评论。我意识到我没有真正理解这个问题(我认为它还没有包含足够的数据)。如果
做一些事情
是有意义的工作,需要花费大量时间,那么我同意Martin的建议,循环应该很好。如果这是一个不花时间的简单代码,那么您将创建@BrianRoach指出的暖手器。