Java線程池ForkJoinPool實例解析
這篇文章主要介紹了Java線程池ForkJoinPool實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
背景:ForkJoinPool的優(yōu)勢在于,可以充分利用多cpu,多核cpu的優(yōu)勢,把一個任務(wù)拆分成多個“小任務(wù)”,把多個“小任務(wù)”放到多個處理器核心上并行執(zhí)行;當多個“小任務(wù)”執(zhí)行完成之后,再將這些執(zhí)行結(jié)果合并起來即可。這種思想值得學(xué)習(xí)。
import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.RecursiveTask;
/**
* 分割 合并 線程池
* 類似于遞歸的歸并排序,這個是多線程的遞歸排序
* jdk1.7之后加的
*/
public class ForkJoinPool {
static int[] nums = new int[1000000];
static final int MAX_NUM = 50000;
static Random random = new Random();
static {
for(int i=0; i<nums.length; i++) {
nums[i] = random.nextInt(100);
}
System.out.println("總和1:" + Arrays.stream(nums).sum());
}
/**
* ForkJoinPool里面必須是ForkJoinTask,
* 直接繼承ForkJoinTask類寫起來比較麻煩,
* 可以繼承RecursiveAction(無返回值)和RecursiveTask(遞歸任務(wù),有返回值)
*/
// static class AddTask extends RecursiveAction {
//
// int start, end;
//
// public AddTask(int start, int end) {
// this.start = start;
// this.end = end;
// }
//
// @Override
// protected void compute() {
// if(end-start <= MAX_NUM) {
// long sum = 0L;
// for(int i=start; i<end; i++) sum += nums[i];
// System.out.println("from:" + start + " to:" + end + " =" + sum);
// }else{
// int middle = start + (end - start) / 2;
//
// AddTask subTask1 = new AddTask(start, middle);
// AddTask subTask2 = new AddTask(middle, end);
// subTask1.fork();
// subTask2.fork();
// }
// }
// }
/**
* 有返回值
*/
static class AddTask extends RecursiveTask<Long> {
int start, end;
public AddTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
if(end-start <= MAX_NUM) {
long sum = 0L;
for(int i=start; i<end; i++) sum += nums[i];
System.out.println("from:" + start + " to:" + end + " =" + sum);
return sum;
}
int middle = start + (end - start) / 2;
AddTask subTask1 = new AddTask(start, middle);
AddTask subTask2 = new AddTask(middle, end);
subTask1.fork();
subTask2.fork();
return subTask1.join() + subTask2.join();
}
}
public static void main(String[] args) {
java.util.concurrent.ForkJoinPool pool = new java.util.concurrent.ForkJoinPool();
AddTask task = new AddTask(0, nums.length);
pool.execute(task); //精靈線程
System.out.println("總和2:" + task.join());
try {
System.in.read(); //阻塞主線程
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot利用Redis實現(xiàn)防止訂單重復(fù)提交的解決方案
在涉及訂單操作的業(yè)務(wù)中,防止訂單重復(fù)提交是一個常見需求,用戶可能會因誤操作或網(wǎng)絡(luò)延遲而多次點擊提交訂單按鈕,導(dǎo)致訂單重復(fù)提交,所以本文給大家介紹了SpringBoot利用Redis實現(xiàn)防止訂單重復(fù)提交的解決方案,需要的朋友可以參考下2024-10-10
spring aop action中驗證用戶登錄狀態(tài)的實例代碼
本篇文章主要介紹了spring aop action中驗證用戶登錄狀態(tài)的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
一文快速了解spring?boot中的@idempotent注解
idempotence注解是RESTful API設(shè)計中一個重要的概念,它可以保證操作的可靠性和一致性,下面這篇文章主要給大家介紹了關(guān)于spring?boot中@idempotent注解的相關(guān)資料,需要的朋友可以參考下2024-01-01
Mybatis之typeAlias配置的3種方式小結(jié)
這篇文章主要介紹了Mybatis之typeAlias配置的3種方式小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
淺談web服務(wù)器項目中request請求和response的相關(guān)響應(yīng)處理
這篇文章主要介紹了淺談web服務(wù)器項目中request請求和response的相關(guān)響應(yīng)處理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

