代码之家  ›  专栏  ›  技术社区  ›  SchoolJava101

Java-无任何指示的线程停止

  •  0
  • SchoolJava101  · 技术社区  · 8 年前

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

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

    现在它突然运行起来没有问题了吗?

    有人知道这可能是什么原因吗?提前谢谢!

    1 回复  |  直到 8 年前
        1
  •  2
  •   OldCurmudgeon    8 年前

    仅仅添加一个print语句就可以解决问题,因为您正在旋转。

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

    Thread.sleep(0) 这将为其他线程释放cpu以获得cpu时间。

    BlockingQueue )所以你的线程大部分时间都在等待/阻塞。

    推荐文章