多线程并发计算数据
来源:互联网 发布:战地4 mac版下载地址 编辑:程序博客网 时间:2024/05/29 18:26
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.Callable;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.Future;
- public class LargSumWithCallable {
- static int threadCounts =10;//使用的线程数
- static long sum=0;
- public static void main(String []args) throws InterruptedException, ExecutionException{
- ExecutorService exec=Executors.newFixedThreadPool(threadCounts);
- List<Callable<Long>> callList=new ArrayList<Callable<Long>>();
- List<Integer> list = new ArrayList<Integer>();
- for (int j = 0; j <= 1000000;j++) {
- list.add(j);
- }
- int len=list.size()/threadCounts;//平均分割List
- //List中的数量没有线程数多(很少存在)
- if(len==0){
- threadCounts=list.size();//采用一个线程处理List中的一个元素
- len=list.size()/threadCounts;//重新平均分割List
- }
- for(int i=0;i<threadCounts;i++){
- final List<Integer> subList;
- if(i==threadCounts-1){
- subList=list.subList(i*len,list.size());
- }else{
- subList=list.subList(i*len, len*(i+1)>list.size()?list.size():len*(i+1));
- }
- //采用匿名内部类实现
- callList.add(new Callable<Long>(){
- public Long call() throws Exception {
- long subSum=0L;
- for(Integer i:subList){
- subSum+=i;
- }
- System.out.println("分配给线程:"+Thread.currentThread().getName()+"那一部分List的整数和为:\tSubSum:"+subSum);
- return subSum;
- }
- });
- }
- List<Future<Long>> futureList=exec.invokeAll(callList);
- for(Future<Long> future:futureList){
- sum+=future.get();
- }
- exec.shutdown();
- System.out.println(sum);
- }
- }
- 方案2
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.BrokenBarrierException;
- import java.util.concurrent.CyclicBarrier;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class LargeListIntegerSum {
- private long sum;//存放整数的和
- private CyclicBarrier barrier;//障栅集合点(同步器)
- private List<Integer> list;//整数集合List
- private int threadCounts;//使用的线程数
- public LargeListIntegerSum(List<Integer> list,int threadCounts) {
- this.list=list;
- this.threadCounts=threadCounts;
- }
- /**
- * 获取List中所有整数的和
- * @return
- */
- public long getIntegerSum(){
- ExecutorService exec=Executors.newFixedThreadPool(threadCounts);
- int len=list.size()/threadCounts;//平均分割List
- //List中的数量没有线程数多(很少存在)
- if(len==0){
- threadCounts=list.size();//采用一个线程处理List中的一个元素
- len=list.size()/threadCounts;//重新平均分割List
- }
- barrier=new CyclicBarrier(threadCounts+1);
- for(int i=0;i<threadCounts;i++){
- //创建线程任务
- if(i==threadCounts-1){//最后一个线程承担剩下的所有元素的计算
- exec.execute(new SubIntegerSumTask(list.subList(i*len,list.size())));
- }else{
- exec.execute(new SubIntegerSumTask(list.subList(i*len, len*(i+1)>list.size()?list.size():len*(i+1))));
- }
- }
- try {
- barrier.await();//关键,使该线程在障栅处等待,直到所有的线程都到达障栅处
- } catch (InterruptedException e) {
- System.out.println(Thread.currentThread().getName()+":Interrupted");
- } catch (BrokenBarrierException e) {
- System.out.println(Thread.currentThread().getName()+":BrokenBarrier");
- }
- exec.shutdown();
- return sum;
- }
- /**
- * 分割计算List整数和的线程任务
- *
- */
- public class SubIntegerSumTask implements Runnable{
- private List<Integer> subList;
- public SubIntegerSumTask(List<Integer> subList) {
- this.subList=subList;
- }
- public void run() {
- long subSum=0L;
- for (Integer i : subList) {
- subSum += i;
- }
- synchronized(LargeListIntegerSum.this){//在LargeListIntegerSum对象上同步
- sum+=subSum;
- }
- try {
- barrier.await();//关键,使该线程在障栅处等待,直到所有的线程都到达障栅处
- } catch (InterruptedException e) {
- System.out.println(Thread.currentThread().getName()+":Interrupted");
- } catch (BrokenBarrierException e) {
- System.out.println(Thread.currentThread().getName()+":BrokenBarrier");
- }
- System.out.println("分配给线程:"+Thread.currentThread().getName()+"那一部分List的整数和为:\tSubSum:"+subSum);
- }
- }
- public static void main(String[] args) {
- List<Integer> list = new ArrayList<Integer>();
- int threadCounts = 10;//采用的线程数
- for (int i = 1; i <= 1000000; i++) {
- list.add(i);
- }
- long start= System.currentTimeMillis();
- LargeListIntegerSum countListIntegerSum=new LargeListIntegerSum(list,threadCounts);
- long sum=countListIntegerSum.getIntegerSum();
- System.out.println("List中所有整数的和为:"+sum);
- long end= System.currentTimeMillis();
- System.out.println(end-start);
- }
- }
阅读全文
0 0
- 多线程并发计算数据
- 多线程并发快速处理数据
- java多线程共享数据和数据并发
- 多线程计算数据,然后合并数据
- .NET 多线程同步 / 并发操作数据唯一
- NET 多线程同步 / 并发操作数据唯一
- 使用SmartWeatherAPI多线程并发获取天气数据
- ListeningExecutorService配合CountDownLatch多线程并发处理数据
- 关于多线程处理数据并发问题处理
- Redis修改数据多线程并发—Redis并发锁
- .NET并行计算和并发3.2-多线程调用Invoke
- 利用多线程计算目录数据大小
- 多线程并发
- 多线程、并发
- 多线程并发
- 多线程并发
- 并发多线程
- 多线程并发
- for循环与for in循环
- 常用设置记录以防想不起来
- Elasticsearch(十一)elasticsearch搜索--最基本的工具
- mysql(一):mysql数据库以及创建表
- WebRTC实时音视频技术的整体架构介绍
- 多线程并发计算数据
- 【Scikit-Learn 中文文档】分解成分中的信号(矩阵分解问题)
- JSON中toJSONString、parseObject、parseArray的作用
- 大公司的apk异常处理方式
- 2.1电缆传输介质
- Kafka设计解析(八)- Exactly Once语义与事务机制原理
- Linux服务器安装mysql
- kinect1获取彩色图
- [图像]Canny检测的Matlab实现(含代码)