2017-04-07 61 views
0

我正在使用執行程序框架來創建Fadder對象的多個實例並打印結果。我正在嘗試學習如何使用多線程來更快地完成任務。我遇到的問題是,每次運行程序時都會按隨機順序打印數字。我認爲爲循環的每次迭代創建一個新對象可以解決這個問題,但它仍然以「隨機」順序打印數字。有沒有什麼方法可以保證線程按照它們假定的運行順序打印?像1,2,3,4,5。謝謝使用執行程序的線程池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);