2015-01-13 64 views
0

我有一個主類的應用程序,它爲幾個其他可運行類設置線程執行程序,但是我希望定期調用主類中的更新方法,所以最好創建一個類似於下面例子的線程,或者將類提交給內部聲明的線程執行程序(如下例所示)?Java線程執行程序提交主要類

使用線程執行程序和啓動標準線程的混合感覺錯誤。

對主類更新使用標準線程調用?

公共類的測試{

private ScheduledExecutorService scheduledThreadPool; //used for creating other threads 
private Thread t; 

public Test() { 
    t = new Thread() { 
     @Override 
     public void run() { 
      try { 
       while (true) { 
        processUpdates(); 
        Thread.sleep(10); 
       } 
      } catch (InterruptedException e) { 
       logger.error(e); 
      } 
     } 
    }; 
} 

private void processUpdates() { 
    //do some stuff 
} 

}

或使用線程執行人不僅其他可運行類,但主要的類本身?

公共類測試實現Runnable {

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); 

public Test() { 
    scheduledThreadPool.scheduleWithFixedDelay(this, 0, 10, TimeUnit.MILLISECONDS); 
} 

@ Override 
public void run() { 
    processUpdates(); 
} 

private void processUpdates() { 
    //do some stuff 
} 

}

謝謝!

回答

0

始終對普通的舊線程使用線程池:它使您可以更好地控制線程的執行。

如果您希望所有線程並行運行,則始終可以使用無限制的線程池,因爲Thread在內存中的代價很大,所以不鼓勵這種線程池。

在你的情況下,更推薦使用ScheduledExecutorService,因爲它避免了線程實現中的sleep指令。它提供了更好的性能和更好的可讀性。

+0

因此,將主類提交給一個線程池本身聲明是可行的嗎? – user3469157

+0

是@ user3469157,這是不錯的做法。如果你有任何問題,那麼你應該把線程移動到一個內部類中,或者使用'main()'方法把它拉出到遠離類的外部類。 – Gray