代码
import java.util.Random;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
public class TestForkJoinMax {
public static void main(String[] args) {
Random r = new Random();
int[] data = new int[40000000];
for(int i = 0 ; i < data.length ; i++){
data[i] = r.nextInt(100000000);
}
System.out.println(findMax1(data));
System.out.println(findMax2(data));
}
static int findMax1(int[] data){
long t1 = System.nanoTime();
int max = data[0];
for(int i = 1 ; i < data.length ; i++){ //单核cpu
if (data[i] > max) max = data[i];
}
long t2 = System.nanoTime();
System.out.println(t2-t1);
return max;
}
static int findMax2(int[] data){
class MaxTask extends RecursiveTask<Integer>{
int[] data;
int start;
int end;
public MaxTask(int[] data, int start, int end) {
super();
this.data = data;
this.start = start;
this.end = end;
}
static final int THRESHOLD = 1000000; //阈值 决定小任务的数量 MaxTask对象的创建个数
//任务少 不利于工作窃取算法的发挥
public Integer compute(){ //多核cpu 并行cpu
if (end - start <= THRESHOLD){
int max = data[start];
for(int i = start+1 ; i<end ; i++){
if (data[i] > max) max=data[i];
}
return max;
}
else{
int middle = (start+end)/2;
MaxTask t1 = new MaxTask(data , start , middle);
MaxTask t2 = new MaxTask(data , middle , end);
invokeAll(t1,t2); //将任务提交给线程池
//t1.fork();
//t2.fork();
int result1 = t1.join();
int result2 = t2.join();
if (result1 > result2 ) return result1;
else return result2;
}
}
}
long t1 = System.nanoTime();
ForkJoinPool pool = new ForkJoinPool();
MaxTask main = new MaxTask(data , 0 , data.length);
int result = pool.invoke(main);
long t2 = System.nanoTime();
System.out.println(t2-t1);
return result;
IntStream istream =IntStream.rangeClosed(1,40000000);
int max= istream.parallel().max().getAsInt();
}
}
执行结果
按理来说,并发cpu消耗时间应该少才对,这里我也没有找出原因。很失败!
这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!!!