2016-09-20 30 views
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); 
    } 
} 

,現在突然就沒有問題運行?

有沒有人有任何想法這可能是由於?提前致謝!

+0

你的方法'tick()'是什麼? – SubOptimal

+1

在第一次迭代161次後,JVM已經優化了循環的執行,直到'deltaTime fabian

+0

@SubOptimal it調用該程序的所有更新方法,目前onlu調用一種方法來計算某些對象之間的引力吸引力。 – SchoolJava101

回答

2

添加print語句修復iussue的原因是因爲您在旋轉。

如果一個線程執行一個沒有阻塞/ io /其他線程的緊密循環,它將只會旋轉並佔用cpu,導致所有其他線程獲得更少的資源。

爲了解決這個問題(作爲臨時措施),您可以添加一個Thread.sleep(0),這將釋放其他線程的CPU以獲取CPU時間。

一個更加持久的解決方案應該是組合一些機制來在您的流程之間進行通信(也許是BlockingQueue),以便您的線程可以花費大部分時間等待/阻止。

+0

如果這隻用於程序中的定時,並且不需要進行線程間通信,那麼BlockingQueue是否仍然是理想的?你能夠推薦任何好的教程嗎?再次感謝! – SchoolJava101

+0

@ SchoolJava101 - 如果只是您需要的時間,您可以考慮一個[TimerTask](https://docs.oracle.com/javase/7/docs/api/java/util/TimerTask.html)。 – OldCurmudgeon

+0

@ SchoolJava101 - 另外一個[ScheduledThreadPoolExecutor](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html)可能是一個更靈活的選項。 – OldCurmudgeon