java 并发统计_java并发计算的几种基本使用示例

博客介绍了Java中使用单线程、JUC下多线程以及ForkJoin框架进行计算的方法。给出了ForkJoin框架的基本示例代码,还对比了三种计算方式的性能,并提醒使用ForkJoin要注意合理细分程度,多线程计算需考虑线程切换代价。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常我们使用程序处理计算,常见的有单线程,JUC下单的多线程,还有优秀的ForkJoin框架(与递归形式上相似却又优于递归),直接上代码吧

1 packagecom.fork;2

3 importjava.util.concurrent.ExecutionException;4 importjava.util.concurrent.ForkJoinPool;5 importjava.util.concurrent.ForkJoinTask;6 importjava.util.concurrent.RecursiveTask;7 10

11 public class ForkDemo extends RecursiveTask{12 private longend;13 private final long THRELOD = 500000000L;14 private longstart;15 public ForkDemo(long start ,longend) {16 this.end =end;17 this.start =start;18 }19

20 @Override21 protectedLong compute() {22 long v = 0;23 if( end - start <=THRELOD) {24 for (long i = start; i <= end; i++) {25 v +=i;26 }27 returnv;28 }else{29 long middle = (end + start)/2;30 ForkDemo demo1 = newForkDemo(start, middle);31 ForkDemo demo2 = new ForkDemo(middle+1, end);32 demo1.fork();33 demo2.fork();34 return demo1.join() +demo2.join();35

36 }37 }38 }

这是ForkJoin的基本示例使用,以下是三种计算的比较;

package com.fork;

import java.util.ArrayList;

import java.util.Collections;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.concurrent.Callable;

import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.ForkJoinPool;

import java.util.concurrent.ForkJoinTask;

import java.util.concurrent.Future;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

public class LockDemo {

// 单线程方式

public static long execSingle(long n) {

long sum = 0;

for (long i = 1; i <= n; i++) {

sum += i;

}

System.out.println("the sum = " + sum);

return sum;

}

// 多线程方式

public static long execMult(long n) throws ExecutionException {

long value = 0L;

ExecutorService exect = Executors.newFixedThreadPool(3);

ArrayList> list =new ArrayList>();

long total;

list.add(()->{

long sum = 0L;

for(Long i=1L;i<=n;i+=3) {

sum += i;

}

return sum;

});

list.add(()->{

long sum = 0L;

for(Long i=2L;i<=n;i+=3) {

sum += i;

}

return sum;

});

list.add(()->{

long sum = 0L;

for(Long i=3L;i<=n;i+=3) {

sum += i;

}

return sum;

});

List> end =null;

try {

end = exect.invokeAll(list);

for(Future t:end) {

value += t.get();

}

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

exect.shutdownNow();

System.out.println("this end is " + value);

return value;

}

public static void main(String[] args) throws ExecutionException {

Long start1 = System.currentTimeMillis();

execSingle(3800000000L);

Long end1 = System.currentTimeMillis();

System.out.println("单线程下:end1 - start1 = " +(end1-start1) );

Long start2 = System.currentTimeMillis();

execMult(3800000000L);

Long end2 = System.currentTimeMillis();

System.out.println("多线程下:end2 - start2 = " +(end2-start2) );

Long start3 = System.currentTimeMillis();

ForkJoinPool pool = new ForkJoinPool();

ForkDemo demo = new ForkDemo(0L, 3800000000L);

ForkJoinTask task = pool.submit(demo);

Long end3 = System.currentTimeMillis();

System.out.println("forkjoin框架下:end3 - start3 = " +(end3-start3) );

try {

System.out.println(task.get());

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

最后控制台输出:(ForkJoin 优秀啊.....此处向大神Doug Lea模拜......)

a844e3f260c113da059a14a3316a8902.png

注意ForkJoin需要使用合理的细分程度,这里多线程计算时间夸张了点.....具体情境还是要具体分析,有些情况多线程不一定比多线程快(有线程切换的代价),多线程需要互不依赖,如爬取图片,以此我也不知道....多线程花了这么多时间,哪位大佬给分下.....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值