2017-04-07 2 views
0

Ich verwende ein Executor-Framework, um mehrere Instanzen des Fadder-Objekts zu erstellen und das Ergebnis zu drucken. Ich versuche zu lernen, wie man mehrere Threads verwendet, um eine Aufgabe schneller zu erledigen. Das Problem, das ich habe, ist, dass die Zahlen jedes Mal in einer zufälligen Reihenfolge drucken, wenn ich das Programm ausführe. Ich dachte, das Erstellen eines neuen Objekts für jede Iteration der Schleife würde dieses Problem lösen, aber es druckt immer noch die Nummer in einer "zufälligen" Reihenfolge. Kann ich garantieren, dass die Threads in der Reihenfolge gedruckt werden, in der sie ausgeführt werden sollen? wie 1,2,3,4,5. DankeThread-Pool mit 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

Ja: ändern Sie Ihre erste Zeile zu 'int threadnum = 1;' - ehrlich, lesen Sie oben auf Themen - der springende Punkt ist, dass sie die Dinge parallel tun können, die jeweils in ihrem eigenen Tempo. Wenn Sie die Nummer in sequentieller Reihenfolge drucken möchten, sollten Sie keine Threads verwenden. Die Verwendung von Threads macht dies nicht schneller. Wenn das Berechnen der Zahl viel Zeit in Anspruch nimmt, können Threads sinnvoll sein, Sie können Berechnungen in separaten Threads durchführen, alle Ergebnisse in einer Sammlung sammeln und sie dann sortieren. –

+0

Fadder hat keine 'toString'-Methode, woher wissen Sie, in welcher Reihenfolge sie ausgeführt werden? – immibis

+0

Danke Erwin, ich wusste von threadnum = 1, aber das war nur ein Test, um zu sehen, ob ich es so machen konnte, wie ich es für ein größeres Programm wollte. – Art

Antwort

0

Sie können die Reihenfolge nicht garantieren, in der viele Threads Ihren Code verarbeiten. Aber, wird parallel streamen, können Sie. Siehe unten:

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