2012-02-26 52 views
0

在我的程序中,我編寫了一個類,每次觸發新值時都會更新一堆偵聽器。因此,我使用的是SingleThreadExecutor,該示例應該使其更清楚。我所擔心的是,是否有意義,當我運行它這樣的:使用ExecutorService的最有效方法

Class Update() { 
    ExecutorService svc = Executors.newSingleThreadExecutor(); 

    svc.execute(new Runnable() { 
     public void run() { 
      if(!theListeners.isEmpty()) { 
       for(IgpsdListener l : theListeners) { 
        l.update(jsonObject); 
       } 
      } 
     } 
    }); 

我聽說,那個創建線程是Java相當昂貴的行動,所以我如果我正確地使用它知道。我的意思是,每創建一個新的Runnable對象時都會創建對象?即使是Executor也只使用唯一的線程。

在此先感謝您的幫助和啓發。 nyyrikki

+1

我會提出'如果(theListeners.isEmpty()!)'到外執行()。沒有任何意義,增加一個沒有做任何事情的任務。我假設你正在重複使用你的執行者,而不是爲每個任務創建一個。 – 2012-02-26 21:11:49

+1

執行者只創建一次,正確。你提到的是完全有意義的,如果我將'if()'移動到'execute()'之外,那麼在沒有註冊事件的監聽器的情況下甚至不會執行任務。沒有看到,很好......謝謝! – nyyrikki 2012-02-26 22:22:26

回答

1

這正是你應該做的。 Java在創建像這樣的一次性對象時非常快速;線程可能會很昂貴,但是像在這裏創建Runnable一樣便宜。

+0

runnable很便宜,不是執行者。 – 2012-06-25 10:44:28

1

就性能而言,您的代碼沒有問題。你沒有解釋什麼是jsonObject的來源,但是如果你的Runnable是無狀態的,那麼你可能會逃避創建一個單一實例(可能不是這種情況,但仍值得了解)。

舉例來說,如果這是你的整個代碼:

class Update() { 

    private final List<IgpsdListener> theListeners = //... 

    private ExecutorService svc = Executors.newSingleThreadExecutor(); 

    svc.execute(new Runnable() { 
     public void run() { 
      if(!theListeners.isEmpty()) { 
       for(IgpsdListener l : theListeners) { 
        l.update(); 
       } 
      } 
     } 
    }); 

這可以簡化爲:

class Update() { 

    private final List<IgpsdListener> theListeners = //... 

    private ExecutorService svc = Executors.newSingleThreadExecutor(); 

    final Notifier notifier = new Notifier() 

    //execute this as many times as you want with the same notififer instance 
    svc.execute(notififer); 

    class Notifier implements Runnable { 
      public void run() { 
       if(!theListeners.isEmpty()) { 
        for(IgpsdListener l : theListeners) { 
         l.update(); 
        } 
       } 
      } 
    }