while(true)
Java循环与wait(1)
一起使用的资源是否比使用wait()
和notify()
的阻塞循环更多或更少?
CPU内核是否有一些特殊(硬件)实现允许wait(1)
?如果是,使用这种非阻塞循环时是否有任何限制?
一个例子:
while(true){
wait(1);
//do the job here...
}
(请注意:如果没有wait(1)
,核心会在while(true)
循环中100%激进......)
答案 0 :(得分:6)
至于为什么while (true);
占用的CPU超过while (true) { wait(1); }
的原始问题,请考虑:现代CPU每秒可执行数十亿条指令。使用wait(1)
循环,假设它是完美的并且每次等待一毫秒,您将CPU限制为每秒一千条指令。没有它,没有限制,它可以运行紧密循环每秒数十亿次。
关于哪个新问题更有效,while (true) { wait(1); }
方法与wait()
和notify()
编辑...
好吧,假设你在等待条件。方案一:
while (true) {
wait(1);
if (condition()) {
break;
}
}
VS
wait();
和其他地方:
//code which causes condition() to be true
notify();
假设条件为真需要10秒。在第一种方法中,您拨打wait(1)
10,000次并检查condition()
10,000次。在第二种方法中,您只需拨打wait()
一次,然后notify()
拨打一次。
答案 1 :(得分:2)
这是一个棘手的问题吗?
当你将“wait()”放入循环时,它会释放同步变量,允许其他一些线程前进并最终通知回该线程它可以继续。线程将不会继续,并且不会使用任何cpu周期,直到它获得该通知。这就是为什么必须从sync'd块或方法中调用wait / notify(不清楚你是否在这里这样做)。
相比之下,“while ... true”是一个无限循环,它将使用你给它的每个cpu循环,直到满足结束条件。
我推荐一本关于Java线程和同步的好书,比如http://www.amazon.com/Multithreaded-Programming-Java-Technology-Lewis/dp/0130170070
答案 2 :(得分:0)
它确实使用了更多资源,而且通常不是一个好的设计。即使您在一个特定硬件上的某个特定测试中没有获得更好的性能,您也可以在其他建议中获得更好的性能。
如果因为每个线程的开销而运行了很多这些线程,这将变得尤为重要。
答案 3 :(得分:-1)
基本上,Claudiu是对的:CPU确实很快。
但还有另一个需要考虑的因素:实际上wait(1)
在非阻塞线程中需要 始终 以允许其他线程继续。因为如果根本没有等待,操作系统就无法将资源分配给任何其他线程,并且它们将会发挥作用。另一方面,wait(1)
实际上可能会导致更长的等待,具体取决于操作系统如何分配资源。但这取决于操作系统。
编程时,总有两个因素需要考虑:
1。缓存/ RAM的数量,以及
2。线程/进程所需的时间。
因此,所有关于每时间使用的资源量:MB / s (或通常:字节/秒)。您不仅可以根据许多程序员打算执行的分配资源做出正确的决策。甚至可能是因为没有同步开销,上面的非阻塞floop使用的资源比阻塞的少得多。所以永远不要忘记时间维度。
结论:更快,无阻塞的程序(可以)使用更少的资源。