2017-04-07 5 views
0

私はexecutorフレームワークを使用して、Fadderオブジェクトの複数のインスタンスを作成し、結果を出力しています。私は、複数のスレッドを使ってタスクをより速く完了させる方法を学びたいと考えています。私が抱えている問題は、プログラムを実行するたびに数字がランダムな順序で印刷されることです。私は、ループの各反復のために新しいオブジェクトを作成することは、その問題を解決するだろうと思ったが、それでも数字を「ランダム」な順序で印刷する。スレッドが実行される順序で印刷されることを保証する方法はありますか? 1,2,3,4,5のように。ありがとうExecutor Framrworkを使用したスレッドプール

package fadder; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class Fadder { 
    private final int n; 
    Fadder(int n){ 
     //initialize Fadder 
     this.n = n; 
    } 
    Fadder add(int m){ 
     //create new Fadder 
     return new Fadder(n+m); 
    } 
public static void main(String[] args) { 
    int threadnum = Runtime.getRuntime().availableProcessors(); 
     ExecutorService executor = Executors.newFixedThreadPool(threadnum); 
     Fadder MyAdder = new Fadder(1); 
     for (int i = 0; i < 5; i+=1) { 
      int index = i; 
      //lambda function to print Fadder 
     executor.submit(() -> { 
        System.out.println(String.valueOf(MyAdder.add(index))); 
       }); 
    } 
    executor.shutdown(); 
} 
} 
+0

はい: 'int型threadnum = 1へのあなたの最初の行を変更;' - 正直、スレッドをよく読んでください - 全体のポイントは、彼らが、並行して、自分の速度でそれぞれのことを行うことができるということです。番号を順番に印刷する場合は、スレッドを使用すべきではありません。このためにスレッドを使用しても、それが速くなるわけではありません。数値の計算に時間がかかる場合は、スレッドが意味をなさすことができます。別のスレッドで計算を行い、すべての結果をコレクションにまとめてから並べ替えます。 –

+0

Fadderには 'toString'メソッドがありません。どのような順序で実行されているのか、どのように知っていますか? – immibis

+0

ありがとうございましたErwin、threadnum = 1について知っていましたが、これは大規模なプログラムでもうまく動作するかどうかを確認するためのテストのようなものでした。 – Art

答えて

0

多くのスレッドがコードを処理する順序を保証することはできません。 しかし、並列ストリームになります。以下を参照してください:

Stream<Integer> stream = Stream.iterate(1, i->i+1).limit(5) ; 
     stream.parallel().forEachOrdered(System.out::println); 
関連する問題