Callable接口以及CyclicBarrier实现list数据求和
2014-05-10 18:17
369 查看
public class CountListIntegerWithCallable { public static void main(String[] args) { int threadNum = 10; ExecutorService executorService = Executors.newFixedThreadPool(threadNum); List<Integer> list = new LinkedList<Integer>(); for (int i = 0; i <100; ++i) { list.add(i); } int len = list.size() / threadNum; if (0 == len) { threadNum = list.size(); len = 1; } List<Callable<Long>> callableList = new LinkedList<Callable<Long>>(); for (int i = 0; i < threadNum; ++i) { List<Integer> subList = new LinkedList<Integer>(); if (i == threadNum - 1) {//最后一个线程处理剩下所有任务 subList = list.subList(i * len, list.size()); } else { subList = list.subList(i * len, (i + 1) * len); } final List<Integer> finalSubList = subList; callableList.add(new Callable<Long>() { public Long call() throws Exception { long sum = 0; for (int j = 0; j < finalSubList.size(); j++) { sum += finalSubList.get(j); } System.out.println("分配给线程:"+Thread.currentThread().getName()+" list元素部分计数和为:"+sum); return sum; } }); } try { // 这个不用自己控制等待,invokeAll执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表 List<Future<Long>> futureList = executorService.invokeAll(callableList); for (Future<Long> future : futureList) { System.out.println(future.get()); } } catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (Exception e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } }
public class CountSumWithCyclicBarrier { private CyclicBarrier cyclicBarrier; private long totalSum; private long getSum() { int threadNum = 10; ExecutorService executorService = Executors.newFixedThreadPool(threadNum); List<Integer> list = new LinkedList<Integer>(); for (int i = 0; i < 100; ++i) { list.add(i); } int len = list.size() / threadNum; if (0 == len) { threadNum = list.size(); len = 1; } cyclicBarrier = new CyclicBarrier(threadNum + 1); List<Integer> subList = new LinkedList<Integer>(); for (int i = 0; i < threadNum; ++i) { if (i == threadNum - 1) {//最后一个线程处理剩余list中数据 subList = list.subList(i * len, list.size()); } else { subList = list.subList(i * len, (i + 1) * len); } executorService.submit(new TaskDemo(subList, i)); } try { cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (BrokenBarrierException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } return totalSum; } public static void main(String[] args) { CountSumWithCyclicBarrier countSumWithCyclicBarrier = new CountSumWithCyclicBarrier(); System.out.print(countSumWithCyclicBarrier.getSum()); } class TaskDemo implements Runnable { private List<Integer> subList; private int i; public TaskDemo(List<Integer> subList, int i) { this.subList = subList; this.i = i; } public void run() { long sum = 0; for (int j = 0; j < subList.size(); ++j) { sum += subList.get(j); } System.out.println("分配给线程:" + i + " " + Thread.currentThread().getName() + "那一部分List的整数和为Sum:" + sum); synchronized (TaskDemo.class) { totalSum += sum; } //线程间相互等待,只有所有线程执行完后,才进行下面操作 try { cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (BrokenBarrierException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } } }
cyclicBarrier = new CyclicBarrier(threadNum + 1);threadNum+1 加1会阻塞主线程
countDownLatch和CyclicBarrier区别:
countDownLatch是一个线程,等待其他几个线程完,才继续执行下面代码,例如多人赛跑
CyclicBarrier与CountDownLatch类似,但是可以去完成好几个阶段的任务,比如上述三个人约好去地点A吃饭,到店吃玩饭后继续出发,到下一个目的地,全部到了之后再吃饭。
此时CyclicBarrier可以完成循环等待。
//3个人出发,每个人到店之后报告老板 CyclicBarrier cb =new CyclicBarrier(3); for(...){ //每个人出发 go(cb); }
//一个人的行程 go(CyclicBarrier cb){ //到达地点1,等待其他人到齐 cb.await(); //都到了吃饭,然后再出发 eat then <a target=_blank href="http://www.cxyclub.cn/Tag/continue.html" target="_blank" style="outline-style: none; color: rgb(76, 120, 153);">continue</a> going; //到达地点2,等待其他人到齐 cb.await(); //都到了吃饭 eat; }
相关文章推荐
- List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源代码解析
- Java编程通过list接口实现数据的增删改查代码示例
- 黑马程序员-Condition条件对象、Semaphore、CyclicBarrier、倒计时门栓 CountDownLatch、Exchanger(实现两个线程之间数据交换
- Java LinkedList 实现原理及数据接口
- sqlLite数据库 实现对数据的增删改查 以及用list显示出数据内容
- listview和listFragment详细版,已解决chebox的复用,Glide实现图片的圆形,以及按钮添加数据
- List 接口以及实现类和相关类源码分析
- DropDrowList动态绑定数据以及实现二级变动
- ForkJoinTask以及实现callable接口创建线程的学习
- I2S接口以及Verilog实现数据接收
- 在kendogrid中控制数据格式以及实现求和
- 使用List接口实现对数据的增删改查
- 基于HTTPS协议的12306抢票软件设计与实现--相关接口以及数据格式
- 在fragment里面添加list列表,然后实现跳转(以及数据传递)
- 二、基于HTTPS协议的12306抢票软件设计与实现--相关接口以及数据格式
- 基于HTTPS协议的12306抢票软件设计与实现--相关接口以及数据格式
- 基于HTTPS协议的12306抢票软件设计与实现--相关接口以及数据格式
- list接口以及其实现类Arraaaylist 以及Linkedlist解析
- 通过反射,将datatable转换为List集合(反射读取实体类的属性,并赋值),通过接口来实现MySql和MsSql数据的切换(二层反射),静态构造函数,抽象类和接口的区别
- List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源码解析