Java - 线程在没有任何指示的情况下停止
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);
}
}
现在突然 运行 没问题了?
有谁知道这可能是什么原因造成的?提前致谢!
之所以只添加一个 print 语句就能解决问题,是因为你在旋转。
如果线程在没有 blocking/io/other 的情况下执行紧密循环,它只会旋转并占用 cpu,导致所有其他 polite 线程获得更少资源。
要解决此问题(作为临时措施),您可以添加一个 Thread.sleep(0)
,这将释放 cpu 供其他线程获得 cpu 时间。
一个更永久的解决方案应该是将一些机制放在一起在您的进程之间进行通信(可能是 BlockingQueue
),这样您的线程将花费大部分时间 waiting/blocking。
我有一个奇怪的问题,我正在尝试制作一个使用线程来实现滴答更新系统的程序,使用以下代码:
@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);
}
}
现在突然 运行 没问题了?
有谁知道这可能是什么原因造成的?提前致谢!
之所以只添加一个 print 语句就能解决问题,是因为你在旋转。
如果线程在没有 blocking/io/other 的情况下执行紧密循环,它只会旋转并占用 cpu,导致所有其他 polite 线程获得更少资源。
要解决此问题(作为临时措施),您可以添加一个 Thread.sleep(0)
,这将释放 cpu 供其他线程获得 cpu 时间。
一个更永久的解决方案应该是将一些机制放在一起在您的进程之间进行通信(可能是 BlockingQueue
),这样您的线程将花费大部分时间 waiting/blocking。