2017-07-28 9 views
0

私は伝統的なスレッドの実装に精通していますが、Executorserviceについてはあまりよく分かりません。私はexecutorサービスを使ってスレッドを扱うときにとても便利だと知っています。しかし、私はその実装についてほとんど混乱していません。ExecutorserviceはJavaでどのように動作しますか?

私は親スレッド/メインスレッドと最大スレッドプールサイズ10を持つExecutorサービスを持っているとしましょう。今は、サイズが1000未満の場合にのみjmsキューで特定のタスクを実行したいと思います。おそらく2つの方法でこれを実装すると思います。

ケース1:

class MyThreadClass inmplements Runnable { 
     public static void main(String args[]){ 
      while(true){ 
       int checkQueueSize = jmsQueue.getSize(); 
       while(checkQueueSize<1000){ 
        threadPoolTaskExecutor.execute(this); 
        ++checkQueueSize; 
       } 
      } 
     } 
     public void run(){ 
      jmsQueue.pushMessage("Hello Thread"); 
     } 
} 

ケース2:

class MyThreadClass inmplements Runnable { 
      public static void main(String args[]){ 
      threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); 
       threadPoolTaskExecutor.execute(this); 
      } 
      public void run(){ 
       while(true){ 
        int checkQueueSize = jmsQueue.getSize(); 
        while(checkQueueSize<1000){ 
         jmsQueue.pushMessage("Hello Thread"); 
         ++checkQueueSize; 
        } 
       } 
      } 
    } 

私の理解では、複数のスレッドにまたがるませんケース2です。私は正しいかどうか?または、タスクを実行する別の方法がありますか?

+0

'setWaitForTasksToCompleteOnShutdown'は、Springフレームワークの一部である - あなたは、そのコンテキストに求めていますか? – assylias

+0

はい。それ以外の方法があれば大歓迎です。 – Satyaprakash

+0

'checkQueueSize <= 1000'ステートメントは、ローカル変数 'checkQueueSize'が1000以下の場合、永遠にループします。ループ内の何も変数の値を変更することはできません。 –

答えて

0

「ケース2は複数のスレッドにまたがることはありません」はい。これは正しいです。 executeに一度だけ電話するからです。

最初のシナリオでは、executeに何度も電話することができます。以前のタスクが完了していない場合は、追加のスレッドが実行されます。

+0

実装の**ケース1 **が完全であると仮定できますか? – Satyaprakash

+0

私は個人的に「完璧な」単語を使用しないことを好みますが、はい、それは実行者サービスの使用方法です。また、内部の 'while'を' if'に置き換える必要があります。また、遅延を追加すると良いでしょう。そうしないと、多くのプロセッサティックを消費します。 – talex

+0

お寄せいただきありがとうございます。しかし、内部の 'while'を' if'で置き換えることはできません。内側の 'while'の直前に' jmx'接続を使用して 'jmsQueue'サイズを取得する' getSize() 'メソッドがあります。だから私が 'if'を内部の' while'に置き換えると、それは重い操作である各反復に対して 'jmsQueue'サイズを要求します。とにかく上記のansフィールドでのあなたの提案が私が探しているものです。それで、それを印象づけるようにマーキングする。 – Satyaprakash

0

私のコードを見つけてください: -

class MyThreadClass inmplements Runnable { 
     public static void main(String args[]){ 
      threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); 
      for(int i=0;i<10;i++) 
      threadPoolTaskExecutor.execute(this); 
     } 
     public void run(){ 
      while(true){ 
       int checkQueueSize = jmsQueue.getSize(); 

       if(checkQueueSize<=1000){ 
        jmsQueue.pushMessage("Hello Thread"); 
       } 
      } 
     } 
    } 

修正: -

  1. 10個のスレッドを作成してのRunnableクラスオブジェクトを渡すことで、ジョブを実行するためにそれらを割り当てます。
    1. 無限ループを外側ループとして削除し、無限ループを実行します。
+0

素晴らしい提案です。しかし、この場合、実行するタスクがなくてもスレッドはアイドル状態にならないと思いませんか? – Satyaprakash

関連する問題