当前位置:网站首页>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));
}
}
边栏推荐
- 扩散(多源广搜)
- My experience from technology to product manager
- kotlin位运算的坑(bytes[i] and 0xff 报错)
- Talking from mlperf: how to lead the next wave of AI accelerator
- Diffusion (multi-source search)
- C# ManualResetEvent 类的理解
- IT服务管理(ITSM)在高等教育领域的应用
- π disk, turning your computer into a personal private cloud
- 【ITSM】什么是ITSM,IT部门为什么需要ITSM
- Bat operation FTP upload and download command
猜你喜欢

69 Cesium代码datasource加载geojson

Freeswitch dial the extension number

【ManageEngine卓豪】网络运维管理是什么,网络运维平台有什么用

TiDB单机模拟部署生产环境集群(闭坑实践,亲测有效)

Transformer le village de tiantou en un village de betteraves sucrières

让厦门灌口镇田头村变甜头村的特色农产品之一是蚂蚁新村

【文件系统】如何在ubi之上运行squashfs

68 cesium code datasource loading czml
![kotlin位运算的坑(bytes[i] and 0xff 报错)](/img/2c/de0608c29d8af558f6f8dab4eb7fd8.png)
kotlin位运算的坑(bytes[i] and 0xff 报错)

2022 年面向初学者的 10 大免费 3D 建模软件
随机推荐
Solve the problem of garbled files uploaded by Kirin v10
DHT11 temperature and humidity sensor
Preliminary level of C language -- selected good questions on niuke.com
Oracle sequence + trigger
【ManageEngine卓豪】网络运维管理是什么,网络运维平台有什么用
利用百度地图查询全国地铁线路
【ManageEngine卓豪 】助力世界顶尖音乐学院--茱莉亚学院,提升终端安全
golang panic recover自定义异常处理
浏览器端保存数据到本地文件
【ManageEngine卓豪】局域网监控的作用
TiDB单机模拟部署生产环境集群(闭坑实践,亲测有效)
OpenGL es: (2) relationship between OpenGL es, EGL and glsl
Skywalking integrated Nacos dynamic configuration
Cjc8988 Low Power Stereo codec with 2 stereo headphone drivers
Multi label lsml for essay learning records
【ManageEngine】终端管理系统,助力华盛证券数字化转型
阶乘约数(唯一分解定理)
QT write custom control - self drawn battery
地宫取宝(记忆化深搜)
IT服务管理(ITSM)在高等教育领域的应用