2016-07-06 5 views
-1
public class ProcessImpl implements Process { 


    @Override 
    public void process() { 

     List<Callable<Boolean>> tasks = new ArrayList<>(); 
     for (int x = 1; x <= 5; x++) { 
      tasks.add(createTask(x)); 
     } 


     for (int i = 1; i <= 6; i++) { //for each group, there are 6 groups 
      //this is a sequential executor 
      //DefaultThreadExecutor extends AbstractThreadExecutor 
      ExecutorService threadExecutor = new DefaultThreadExecutor(); 
      try { 
       threadExecutor.invokeAll(tasks); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 


    private Callable<Boolean> createTask(final int i) { 
     Callable<Boolean> task = new Callable<Boolean>() { 
      @Override 
      public Boolean call() throws Exception { 
       System.out.println("Performing task " + i + " on thread - " + Thread.currentThread().getName()); 
       return true; 
      } 
     }; 
     return task; 
    } 

} 

複数のタスクを実行しますthreadExecutor.invokeAll(tasks);、タスクがMainスレッドで実行されています。それはこのようなものを出力します。は、コードのこの部分では順次

Performing task 1 on thread - main 
Performing task 2 on thread - main 
Performing task 3 on thread - main 
Performing task 4 on thread - main 
Performing task 5 on thread - main 
Performing task 1 on thread - main 

私は6つのスレッド合計で、各スレッドは順次5つのタスクを完了する必要があり、グループごとスレッドを持って探しています。

これを達成するには、どうすればprocess()を変更しますか?したがって、各スレッドは同時にすべてのスレッドを処理しており、各スレッドで5つのタスクを順番に処理しています他のスレッドを待っていません。 (私がご紹介しますランダムな睡眠と異なる場合があります)

結果

Performing task 1 on thread - group1 
Performing task 1 on thread - group2 
Performing task 2 on thread - group2 
Performing task 1 on thread - group3 
Performing task 2 on thread - group1 
Performing task 3 on thread - group2 
+0

順番に言えば、順番に処理するということです。つまり、タスク2はタスク1を待たなければならないことを意味します。ここで正しい単語を使用しないことがあります。 –

答えて

0

あなたはyourExecutorサービスを初期化するには

@Override 
    public void process() { 

     List<Callable<Boolean>> tasks = new ArrayList<>(); 
     for (int x = 1; x <= 5; x++) { 
      tasks.add(createTask(x)); 
     } 

    ExecutorService service = Executors.newFixedThreadPool(5 or 6 depending on how much threads you want to run in parallel); 

     for (int i = 1; i <= 6; i++) { //for each group, there are 6 groups 
      //this is a sequential executor 
      //DefaultThreadExecutor extends AbstractThreadExecutor 

      try { 
       service.invokeAll(tasks); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

を使用する必要があります。これであなたの呼び出し可能なすべてのスレッドは、利用可能なCPUのスレッドに合わせてキューに入れられます。

+0

こんにちは - 5つのタスク(1000mのリレーレースでは200mと言うことができます)が、6つのスレッドで実行され、レースのチームと言えます。各スレッドは5つのタスクを実行し、イベントを完了します。 – user2781389

+0

ちょうどRuntime.getRuntime()。availableProcessors()を6に置き換えて、あなたは準備ができています:) –

+0

もう一度待ってください! 5タスク6スレッドCallable 1スレッド関係を1つ持つ必要があります。 6つのスレッドで5つのタスクを実行する方法はありません。 :))) –

関連する問題