使用执行器框架的线程池
Thread Pool using Executor Framrwork
我正在使用执行器框架来创建 Fadder 对象的多个实例并打印结果。我正在尝试学习如何使用多个线程来更快地完成任务。我遇到的问题是,每次我 运行 程序时,数字都会以随机顺序打印。我认为为循环的每次迭代创建一个新对象可以解决该问题,但它仍然以 "random" 顺序打印数字。有什么方法可以保证线程按它们假定的顺序打印 运行?像 1,2,3,4,5。谢谢
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();
}
}
您无法保证许多线程处理您的代码的顺序。
但是,将并行流,你可以。见下文:
Stream<Integer> stream = Stream.iterate(1, i->i+1).limit(5) ;
stream.parallel().forEachOrdered(System.out::println);
我正在使用执行器框架来创建 Fadder 对象的多个实例并打印结果。我正在尝试学习如何使用多个线程来更快地完成任务。我遇到的问题是,每次我 运行 程序时,数字都会以随机顺序打印。我认为为循环的每次迭代创建一个新对象可以解决该问题,但它仍然以 "random" 顺序打印数字。有什么方法可以保证线程按它们假定的顺序打印 运行?像 1,2,3,4,5。谢谢
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();
}
}
您无法保证许多线程处理您的代码的顺序。 但是,将并行流,你可以。见下文:
Stream<Integer> stream = Stream.iterate(1, i->i+1).limit(5) ;
stream.parallel().forEachOrdered(System.out::println);