2017-10-30 19 views
-1

ExecutorService newFixedThreadPoolの動作を学習しようとしています。私はexecutorServiceに仕事を割り当て、それが複数のスレッドによって実行されることを期待しています。サイズが5のExecutorService newFixedThreadPoolから実行中のスレッドが1つだけです

シナリオは単純です。

サイズ5のスレッドプールを初期化します。次に、エクゼクティブサービスに作業を割り当てます。 しかし、私は1つのスレッドが作業を処理しているのを見ます。

プール内で使用できる複数のスレッドで処理しないでください。 コード:作業に参加

以上のスレッド:ここ

 ExecutorService executorService = Executors.newFixedThreadPool(5); 

executorService.execute(new Runnable() { 
    public void run() { 
     int k =0; 
     while (k++<5){ 
     System.out.println("Active Thread "+Thread.currentThread().getName()); 
     } 
    } 
}); 

は完全なコードは、私が得た出力は、私が期待していた

Active Thread pool-1-thread-1 
Active Thread pool-1-thread-1 
Active Thread pool-1-thread-1 
Active Thread pool-1-thread-1 
Active Thread pool-1-thread-1 

出力されたある jdoodle.com/a/bRP

です。

EDIT

基本的に私は私の理解が間違っている場合、あなたが私に教えてくださいすることができExecutorServiceの

package Threading; 

public class ThreadDeleteme { 
    public static void main(String[] args) { 
     Work w = new Work(); 
     Thread t1 = new Thread(w); 
     t1.setName("Thread 1 "); 
     Thread t2 = new Thread(w); 
     t2.setName("Thread 2 "); 
     Thread t3 = new Thread(w); 
     t3.setName("Thread 3 "); 
     t1.start(); 
     t2.start(); 
     t3.start(); 
     System.out.println("ThreadDeleteme.main()"); 
    } 

} 

class Work implements Runnable { 
    Integer i = 0; 

    @Override 
    public void run() { 
     while (i < 100) { 
      System.out.println(Thread.currentThread().getName() + " " + i); 

       i++; 
      } 
    } 
} 

を使用してこの動作を複製します。

おかげ

+0

あなたはプールに5つのタスクを与えなかったので、5回ループするタスクを1つ与えました。 –

+0

javadocs(Executorインターフェイス用)を読むと、このコードスニペット 'Executor executor = anExecutor;が表示されます。 executor.execute(新しいRunnableTask1()); executor.execute(new RunnableTask2()); ' –

+0

変更した質問を確認してください。スレッドプールから複数のスレッドで1つの作業を実行したい。 EDITセクションでやっているように – Geek

答えて

0

あなたは、現在のスレッド名(=アクティブスレッドプール-1-スレッド-1)5回を印刷しますONEスレッドを作成しました。 あなたがするために使用ThreadFactory 1を設定することができますExecutorServiceの実装を使用する必要があります問題、 に名前を付けるための5実行可能なインスタンスを作成し、エグゼキュータのサービス

に提出[UPDATE]

public class Main { 
    public static void main(String[] args) { 
     Work w = new Work(); 
     ExecutorService executorService = Executors.newFixedThreadPool(5); 
     executorService.submit(w); 
     executorService.submit(new Work()); // set new runnable tasks here 
     executorService.submit(new Work()); 
     System.out.println("ThreadDeleteme.main()"); 

    } 

} 

class Work implements Runnable { 
    Integer i = 0; 

    @Override 
    public void run() { 
     while (i < 100) { 
      System.out.println(Thread.currentThread().getName() + " " + i); 
      i++; 
     } 
    } 
} 

スレッドの作成、スレッドを作成するインスタンスを適切な名前で渡します。 ThreadFactory DOC

+0

変更した質問を確認してください。スレッドプールから複数のスレッドで1つの作業を実行したい。私のEDITセクションでやっているように – Geek

0

あなたはループを印刷する同じスレッドを使用しますが、別のスレッドでメソッドを呼び出していない、スレッドは自動的にタスクを分割していないあなたはthem.Your main()方法にタスクを割り当てる必要があり

public static void main(String[] args){ 

    ExecutorService executorService = Executors.newFixedThreadPool(5); //here you defined thread pool size 
    executorService.submit(new Work()); //added first thread to pool 
    executorService.submit(new Work()); //added second thread 
    executorService.submit(new Work()); //added third thread 
} 
のように見えます

そして、あなたのワーク・クラス:あなたはTASの数を作成する必要が

class Work implements Runnable { 
int i = 0; 

@Override 
public void run() { 
    while (i < 100) { 
     System.out.println(Thread.currentThread().getName() + " " + i); 

      i++; 
     } 
} 

}

2

代わりに、ただ1つしか作成しませんでした。だから、次のようなものがあなたのために働くはずです。しかし、タスクが別のタスクを作成するよりも速く完了すると、どのスレッドもすべてのスレッドにヒットしない可能性があります。

ExecutorService executorService = Executors.newFixedThreadPool(5); 

    int k =0; 
    while (k++<5){ 
     executorService.execute(new Runnable() { 
      public void run() { 
       System.out.println("Active Thread "+Thread.currentThread().getName()); 
     }); 
     } 
}; 
+0

私の変更された質問を確認してください。スレッドプールから複数のスレッドで1つの作業を実行したい。私のEDITセクションでやっているように – Geek

+0

@Geekあなたの編集したコードは現在の形で意味をなさない。すべてのスレッドが同じオブジェクトにアクセスしているため、並行性の問題が発生します。また、あなたの例はあまりにも単純です。一般的に、問題を小さなサブ問題に分割する必要があります。それはスレッドプールがあなたのためにしないものです。本当に並列化したいものを表示すると、より簡単になります。 – AKSW

+0

@Geekはい、あなたの 'アップデート'はあなたが提供した 'スレッド'の例に似ています。あなたは同じ「仕事」を使うこともできました。しかし、それは非常に単純であまり有用ではない例です。現実世界では、スレッド間の同期とデータへの同時アクセスを処理する必要があります....あなたの場合のEexcurtorServiceは、スレッドを処理するスレッドの数を5に制限します。それをやる。実行のために3つのタスクしかスケジューリングしていないので、いずれの場合も2つのスレッドが無駄になります。 – Serge

関連する問題