2017-04-07 2 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);