当前位置:网站首页>ForkJoin和Stream流测试
ForkJoin和Stream流测试
2022-07-01 06:09:00 【qq_52025208】
什么是ForkJoin?
ForkJoin 在 JDK 1.7 , 并行执行任务!提高效率。大数据量! 大数据:Map Reduce (把大任务拆分为小任务)
ForkJoin特点:工作窃取
ForkJoinPool内部原理-工作窃取
在 ForkJoinPool 中,线程池中每个工作线程(ForkJoinWorkerThread)都对应一个任务队列(WorkQueue),工作线程优先处理来自自身队列的任务(LIFO或FIFO顺序,参数 mode 决定),然后以FIFO的顺序随机窃取其他队列中的任务。
import java.util.concurrent.RecursiveTask;
/** * 求和计算的任务! * 3000 6000(ForkJoin) 9000(Stream并行流) * // 如何使用 forkjoin * // 1、forkjoinPool 通过它来执行 * // 2、计算任务 forkjoinPool.execute(ForkJoinTask task) * // 3. 计算类要继承 ForkJoinTask */
public class ForkJoinDemo extends RecursiveTask<Long> {
private Long start;
private Long end;
//临界值
private Long tmp = 10000L;
public ForkJoinDemo(Long start, Long end) {
this.start = start;
this.end = end;
}
// 计算方法
@Override
protected Long compute() {
if ((end-start)<tmp){
Long sum = 0L;
for (Long i = start; i <= end; i++) {
sum += i;
}
return sum;
}else {
// forkjoin 递归
long middle = (start + end) / 2; // 中间值
ForkJoinDemo task1 = new ForkJoinDemo(start, middle);
task1.fork(); // 拆分任务,把任务压入线程队列
ForkJoinDemo task2 = new ForkJoinDemo(middle+1, end);
task2.fork(); // 拆分任务,把任务压入线程队列
return task1.join() + task2.join();
}
}
}
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.stream.LongStream;
public class Main {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// test1();
// test2();
test3();
}
// 普通程序员
public static void test1(){
Long sum = 0L;
long start = System.currentTimeMillis();
for (Long i = 1L; i <= 10_0000_0000; i++) {
sum += i;
}
long end = System.currentTimeMillis();
System.out.println("sum="+sum+" 时间:"+(end-start));
}
// 会使用ForkJoin
public static void test2() throws ExecutionException, InterruptedException {
long start = System.currentTimeMillis();
ForkJoinPool pool = new ForkJoinPool();
ForkJoinTask<Long> task = new ForkJoinDemo(0L,10_0000_0000L);
ForkJoinTask<Long> submit = pool.submit(task);
Long sum = submit.get();
long end = System.currentTimeMillis();
System.out.println("sum="+sum+" 时间:"+(end-start));
}
// Stream并行流 ():range (]:rangeClosed
public static void test3(){
long start = System.currentTimeMillis();
long sum = LongStream.rangeClosed(0L,10_0000_0000L).parallel().reduce(0,Long::sum);
long end = System.currentTimeMillis();
System.out.println("sum="+sum +"时间:"+(end-start));
}
}
边栏推荐
- OpenGL es: (3) EGL, basic steps of EGL drawing, eglsurface, anativewindow
- 利用百度地图查询全国地铁线路
- Tidb single machine simulation deployment production environment cluster (closed pit practice, personal test is effective)
- 【ManageEngine卓豪】助力黄石爱康医院实现智能批量化网络设备配置管理
- FPGA - 7系列 FPGA内部结构之Clocking -02- 时钟布线资源
- Advanced drawing skills of Excel lecture 100 (1) - use Gantt chart to show the progress of the project
- 基于LabVIEW的计时器
- Make: g++: command not found
- SystemVerilog学习-09-进程间同步、通信和虚方法
- Stack Title: parsing Boolean expressions
猜你喜欢
随机推荐
分布式锁实现
SystemVerilog学习-08-随机约束和线程控制
π disk, turning your computer into a personal private cloud
Save data in browser to local file
讓田頭村變甜頭村的特色農產品是仙景芋還是白菜
Codeforces Round #803 (Div. 2)vp
golang panic recover自定义异常处理
Movable mechanical wall clock
Top 10 Free 3D modeling software for beginners in 2022
1034 Head of a Gang
excel初级应用案例——杜邦分析仪
QT write custom control - self drawn battery
excel動態圖錶
交换机配置软件具有的作用
three.js小结
DEV XPO对比之UOW
Projects and dependencies in ABP learning solutions
c# Xml帮助类
Linux closes the redis process SYSTEMd+
pycharm 配置jupyter








