【发布时间】:2015-08-29 16:08:33
【问题描述】:
我有一个线程,只有在特定情况下才能工作。否则它只会遍历一个空的无限循环:
public void run() {
while(true) {
if(ball != null) {
// do some Calculations
}
}
}
当循环实际上什么都不做但它必须检查它是否必须在每次迭代时进行计算时,它会影响性能吗? 只在需要时创建这个线程对我来说不是一个选项,因为我的实现 Runnable 的类是一个一直显示的可视对象。
编辑:那么以下是一个好的解决方案吗?还是使用不同的方法更好(关于性能)?
private final Object standBy = new Object();
public void run() {
while(true) {
synchronized (standBy) {
while(ball != null) // should I use while or if here?
try{ standBy.wait() }
catch (InterruptedException ie) {}
}
if(ball != null) {
// do some Calculations
}
}
public void handleCollision(Ball b) {
// some more code..
ball = b;
synchronized (standBy) {
standBy.notify();
}
}
【问题讨论】:
-
使用
BlockingQueue;这个无限循环会吃掉你所有的 CPU 时间。 -
没有任何情况下该线程不起作用。它总是在工作。
-
您的计算机有备用处理器吗?如果你有足够多的处理器,一个可连续运行的线程很便宜。如果没有,那就要花钱了。
-
除了不必要地消耗 CPU 时间之外,您的第一个代码示例是不正确的:只有在某种同步操作在线程之间建立了先发生关系时,才能保证其他线程所做的更改是可见的。因此,您的代码可能无法检测到
ball已设置。
标签: java multithreading performance infinite-loop