使用Java在循环内并行执行方法
作者:互联网
我有下面的代码.在一个循环中,它正在执行方法“ process”.它按顺序运行.我想并行运行此方法,但是应该在循环内完成它,以便可以在下一行中求和.即即使它并行运行,所有功能也应在第二个for循环执行之前完成.
如何在Jdk1.7而非JDK1.8版本中解决此问题?
public static void main(String s[]){
int arrlen = 10;
int arr[] = new int[arrlen] ;
int t =0;
for(int i=0;i<arrlen;i++){
arr[i] = i;
t = process(arr[i]);
arr[i] = t;
}
int sum =0;
for(int i=0;i<arrlen;i++){
sum += arr[i];
}
System.out.println(sum);
}
public static int process(int arr){
return arr*2;
}
解决方法:
以下示例可能会对您有所帮助.我已经使用fork / join框架来做到这一点.
对于像您的示例这样的小型数组,常规方法可能会更快,并且我怀疑fork / join方式会花费更长的时间.但是对于较大的规模或过程,fork / join框架是合适的.甚至Java 8并行流也使用fork / join框架作为基础.
public class ForkMultiplier extends RecursiveAction {
int[] array;
int threshold = 3;
int start;
int end;
public ForkMultiplier(int[] array,int start, int end) {
this.array = array;
this.start = start;
this.end = end;
}
protected void compute() {
if (end - start < threshold) {
computeDirectly();
} else {
int middle = (end + start) / 2;
ForkMultiplier f1= new ForkMultiplier(array, start, middle);
ForkMultiplier f2= new ForkMultiplier(array, middle, end);
invokeAll(f1, f2);
}
}
protected void computeDirectly() {
for (int i = start; i < end; i++) {
array[i] = array[i] * 2;
}
}
}
您的主要班级想在下面这样
public static void main(String s[]){
int arrlen = 10;
int arr[] = new int[arrlen] ;
for(int i=0;i<arrlen;i++){
arr[i] = i;
}
ForkJoinPool pool = new ForkJoinPool();
pool.invoke(new ForkMultiplier(arr, 0, arr.length));
int sum =0;
for(int i=0;i<arrlen;i++){
sum += arr[i];
}
System.out.println(sum);
}
标签:java-threads,multithreading,java 来源: https://codeday.me/bug/20191110/2014778.html