2011-08-23 44 views
5

約執行人最好使用一些問題的內存和時間性能:執行人使用和成本損失

  1. 有沒有招致使用

    ExecutorService e = Executors.newSingleThreadExecutor(); 
    e.execute(callable) 
    e.shutdown() 
    

    任何成本損失相比:

    new Thread(runnable).start() 
    
  2. 如果一個Callable不是一個長的,並且永遠不會超過運行它的一個實例可以使用(1)中的代碼嗎?或者是否最好將ExecutorService作爲靜態實例並在調用之間重用?

  3. 如果我有幾個任務,如(2)中所述,是否有任何問題與每個任務有自己的執行器服務或更好地有一個集中? (我正在談論一個客戶端應用程序,通常不會有超過一個這些任務運行)

  4. Executor消耗什麼資源,如果它不關機()?

回答

6

是否有使用

ExecutorService e=Executors.newSingleThreadExecutor(); 
e.execute(callable) 
e.shutdown() 

任何成本損失相比:

new Thread(runnable).start() 

是的,有一個 「懲罰」:在ExecutorService將最有可能創建成本更高,因爲它還爲您提交的任務創建隊列,並且創建一個隊列讀取在關閉之前失敗,那麼失敗的線程將被替換爲另一個,以便運行任何後續任務(所以這裏有相當多的邏輯)。但是,您可能不希望在每次運行任務時創建一個ExecutiveService ......這可能不是ExecutorService的最佳使用(更多內容參見下一個問題)。

如果一個Callable不是一個長的,並且永遠不會多於一個實例運行它,那麼使用-1-的代碼是可以的?或者最好將ExecutorService作爲靜態的並在調用之間重用?

建議的使用ExecutorService的是作爲一個線程池,在那裏你保持ExecutorService周圍,你不斷提交任務,它只要你有任務提交。它可以是靜態的或只是一個普通的成員,這是不相關的,高度依賴於你的需求/設計。即使您一次只運行一個實例(即,您只有一個單線程執行程序),但使用ExecutorService仍然更有效,因爲它重用了該線程,所以從長遠來看,它會比創建爲您提交的每項任務提供一個新線程。

如果我有幾個任務......每個任務都有任何問題有執行者的服務或更好地有一個集中的嗎?

沒有問題,但效率低下,所以只需要一個集中的執行器服務。

如果執行程序沒有關閉(),哪些資源會消耗執行程序?

我不認爲你應該特別擔心,特別是如果你在正確的上下文中使用Executor,它將是最小的。

0

ExecutorService的要點是在固定數量的線程中共享許多任務。創建ExecutorService來運行單個任務是浪費的開銷。

new Thread(runnable).start()應該總是比創建一個ExecutorService快,因爲ExecutorService無論如何都會創建該線程,但會增加跟蹤它的開銷。