2012-02-26 9 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オブジェクトが作成されますか?エグゼキュータでさえ、唯一のスレッドしか使用しません。

ご協力いただきありがとうございます。 nyyrikki

+1

に私が実行し、外部に 'もし'移動します()。何もしないタスクを追加する点はありません。私はあなたがあなたのエグゼキュータを再利用していると仮定し、各タスクごとに作成しないでください。 –

+1

エグゼキュータは1回だけ作成されます。あなたが言及したことは完全に意味があります。 'if()'を 'execute()'の外に移動すると、イベントはリスナーがイベントに登録していない場合でも実行されません。それを見ていない、素敵な...ありがとう! – nyyrikki

答えて

1

これは、あなたがやっていることになっているまさにです。 Javaは、このようなワンショットオブジェクトを作成するのは非常に高速です。スレッドは高価かもしれませんが、あなたがここで行うようにRunnableを作成するだけで安いです。

+0

実行可能ファイルは安価ですが、実行ファイルはありません。 –

1

パフォーマンスに関する限り、コードは問題ありません。 jsonObjectのソースは何かを説明していませんが、Runnableがステートレスの場合は、1つのインスタンスだけを作成することもできます(おそらく大文字小文字は区別されませんが、それでも分かります)。例えば

これはあなたの全体のコードの場合:

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

これはに単純化することができる:(!theListeners.isEmpty())

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