[英]Java - Thread Stops Without Any Indication
我有一个奇怪的问题,我正在尝试使用以下代码制作一个使用线程来实现刻度更新系统的程序:
@Override
public void run(){
long lastTime = System.nanoTime();
long deltaTime;
float passedTime = 0;
long ticks = 0;
while(true){
long currentTime = System.nanoTime();
deltaTime = currentTime - lastTime;
lastTime = currentTime;
passedTime += deltaTime / tickTime;
if(passedTime * 20 > ticks){
ticks++;
tick();
System.out.println(ticks);
}
}
}
这工作正常,除了在精确的161次滴答之后它只是停止运行,它不会抛出任何东西,没有异常,没有错误,什么也没有。 但是 ,一旦我执行以下操作:
@Override
public void run(){
long lastTime = System.nanoTime();
long deltaTime;
float passedTime = 0;
long ticks = 0;
long useless = 0;
while(true){
long currentTime = System.nanoTime();
deltaTime = currentTime - lastTime;
lastTime = currentTime;
//Don't focus on this bit, I know it's a bit odd.
passedTime += deltaTime / tickTime;
if(passedTime * 20 > ticks){
ticks++;
tick();
System.out.println(ticks);
}
useless++;
System.out.print(useless);
}
}
现在突然运行起来没有问题了吗?
有谁知道这可能是由于什么? 提前致谢!
仅添加打印语句即可解决问题的原因是因为您正在旋转。
如果一个线程执行紧密循环而没有阻塞/ io /其他操作,它将只会旋转并占用CPU,从而导致所有其他礼貌线程获得的资源更少。
为了解决这个问题(作为临时措施),您可以添加一个Thread.sleep(0)
,它将为其他线程释放cpu以获取cpu时间。
一个更永久的解决方案应该是建立某种机制来在您的进程之间进行通信(也许是BlockingQueue
),以便您的线程将大部分时间用于等待/阻塞。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.