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