2016-10-19 8 views
-2

私は問題を抱えている、このように:execのマルチスレッド - javaの

私は50個の要素を持つ配列を持って、私はどのようにそれぞれ、5つのスレッドのdevideない、より高速なため、各要素を計算したいのですがスレッド処理と10要素を計算し、ortherスレッドと重複しません。

変数のようなスレッドの数を覚えています。おそらく5または10か任意の数です。 私は次のように使用してみてください:

ExecutorService executor = Executors.newCachedThreadPool(); 
for(int i = 1; i <= 5; i++){ //mycalculate } 

が、5つのスレッドのすべては、ちょうど最初の10個の要素を処理します。

誰でも私を助けることができます!お願いします。

おかげ

+0

申し訳ありませんが、私はあなたのために投票することはできません... – Akivamu

答えて

0
ExecutorService executor = Executors.newCachedThreadPool(); 
for (int i = 1; i <= 5; i++) { 
    int final taskNo = i; 
    executor.submit(new Runnable() { 
     public void run() { 
      // perform 'mycalculate' for task 'taskNo' 
     } 
    }); 
} 

を(よくない、あなたは私の質問を理解して、私の英語を願っています)(これは、ラムダを使用して、よりきれいに書くことができますが、今のところ、「古典的なJavaの」やり方に固執することができます。)

これは、タスクが終了するのを待つ方法の問題には対処しません。そのためには、submitが返すFutureオブジェクトをキャプチャし、それぞれgetと呼ぶことができます。

タスクが共有オブジェクトを変更した場合に必要となる同期も処理しません。 i「はmycalculate」タスクが長くなり、タスクが互いに干渉しない、とあなたは複数持っている場合は速く...

のために、各要素を計算したいと思います

このアプローチではスピードアップが必要です。

+0

は、そんなにスティーブンありがとうございます...彼らに入力を渡し、あなたがスレッドを作成する方法をいくつかのより多くのコードを追加します。 – NguyenTran

0

このような並列ストリームを試してください。

SomeClass[] array = new SomeClass[50]; 
// fill array 
Stream.of(array) 
    .parallel() 
    .forEach(e -> /* calculate */); 
+0

ありがとう、問題を解決しました! – NguyenTran