Java-线程停止,没有任何指示

Java-线程停止,没有任何指示,java,multithreading,throwable,Java,Multithreading,Throwable,我有一个奇怪的问题,我正试图用以下代码制作一个程序,它使用一个线程来实现一个勾号更新系统: @Override public void run(){ long lastTime = System.nanoTime(); long deltaTime; float passedTime = 0; long ticks = 0; while(true){ long currentTime = System.nanoTime();

我有一个奇怪的问题,我正试图用以下代码制作一个程序,它使用一个线程来实现一个勾号更新系统:

@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语句就可以解决这个问题,这是因为您正在旋转

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

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


一个更持久的解决方案应该是组合一些机制来在进程之间进行通信(可能是一个阻塞队列),这样你的线程将大部分时间花在等待/阻塞上。

只添加一条打印语句的原因是因为你在旋转

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

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


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

您的方法是什么
勾选()
?有可能JVM在第一次161次迭代后优化了循环的te执行,达到了
deltaTime
的程度,如果
tickTime
是一个整数类型,这会导致始终添加0…@次优,它调用程序的所有更新方法,目前,它只调用一种方法来计算某些物体之间的引力。@fabian谢谢,我会尝试改变一些类型,看看它是否有效。滴答时间的价值是什么?我使用第一个代码,运行时没有任何问题……您添加System.out会使passedTime变大。您的方法是什么?
tick()
?JVM有可能在第一次161次迭代后优化了循环的te执行,直到
deltaTime
并且如果
tickTime
是一个整数类型,这导致0总是被添加…@次优它调用程序的所有更新方法,目前它只调用一个计算某些对象之间引力的方法。@fabian谢谢,我将尝试更改一些类型,看看它是否有效。tickTime的值是多少?我使用了第一个代码,运行时没有任何问题……您添加System.out会使passedTime变大。如果这只用于程序中的计时,并且不需要线程间通信,那么BlockingQueue仍然理想吗?你能推荐一些好的教程吗?再次感谢@JojJava101——你可以考虑一个是否只是你需要的时间。@ JojJava101——也可以是一个更灵活的选项。如果这只是用于程序中的定时,并且不需要进行线程间通信,那么阻塞队列仍然是理想的吗?你能推荐一些好的教程吗?再次感谢@Jojjava101-你可以考虑A是否只是你需要的时间。@ Jojjava101-也可以是一个更灵活的选择。