0

我有一个奇怪的问题,我正在尝试使用以下代码制作一个使用线程来实现刻度更新系统的程序:

@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);
    }
}

现在突然它运行没有问题?

有谁知道这可能是由于什么?提前致谢!

4

1 回答 1

2

只添加一个打印语句修复 iussue 的原因是因为你在旋转。

如果一个线程执行一个没有阻塞/io/other 的紧密循环,它只会旋转并占用 cpu,导致所有其他礼貌线程获得更少的资源。

为了解决这个问题(作为临时措施),您可以添加一个Thread.sleep(0)它将释放 cpu 以供其他线程获取 cpu 时间。

一个更持久的解决方案应该是组合一些机制来在您的进程(可能是一个BlockingQueue)之间进行通信,以便您的线程花费大部分时间等待/阻塞。

于 2016-09-20T09:52:25.023 回答