文档章节

CyclicBarrier处理控制多线程顺序

找寻
 找寻
发布于 2011/05/23 15:33
字数 374
阅读 308
收藏 4

   一直苦于无法控制多线程的处理顺序,最近看到java提供了很好的工具,所以抓过来学习下。但是看了一通注释还有网上的一堆解释,看的头晕。还是写一个测试代码来理解好了。

  示例代码实现了,多个线程处理list加总和的问题。

  主要有两点需要注意:

        1,通过CyclicBarrier来控制多线程处理流程

        2,通过synchronized来同步汇总总和

package com.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 模拟多个线程来处理list的数据加和,并最后打出结果
 * @author owen.huang
 *
 */

class SumList implements Runnable{
 private List<Integer> subList;
 private CyclicBarrier barrier;
 private Integer subSum = 0;
 public static Long allSum = 0l;
 private static Object obj = new Object();
 
 public Integer getSubSum() {
  return subSum;
 }

 public SumList(List<Integer> subList, CyclicBarrier barrier){
  this.subList = subList;
  this.barrier = barrier;
 }
 
 public void run() {
  for(int i=0;i<subList.size();i++){
   subSum = subSum + subList.get(i);
  }
  
  synchronized(obj){
   allSum = allSum + subSum;
  }
  
  try {
   barrier.await();//要求计算完毕,等待其它线程
  } catch (InterruptedException e) {
   e.printStackTrace();
  } catch (BrokenBarrierException e) {
   e.printStackTrace();
  }
 }
}

public class TestCyclicbarrier {
 public static void main(String[] args){
  int threadCounts = 10;//线程数
  int num = 100000;
  

 //之所以加1,是为了控制主线程,让它等待知道所有线程走完
  CyclicBarrier barrier = new CyclicBarrier(threadCounts+1);
  
  List<Integer> list = new ArrayList<Integer>();
  for(int i=0;i<num;i++){
   list.add(i);
  }
  
  int intval = num/threadCounts;
  
  for(int i=0;i<threadCounts;i++){
   List<Integer> subList = list.subList(intval*i, intval*(i+1));
   SumList s = new SumList(subList,barrier);
   new Thread(s).start();
  }
  try {
   barrier.await();//要求主线程等待其它线程运行结束
  } catch (InterruptedException e) {
   e.printStackTrace();
  } catch (BrokenBarrierException e) {
   e.printStackTrace();
  }
  System.out.println(SumList.allSum);
 }
}

© 著作权归作者所有

找寻
粉丝 3
博文 15
码字总数 4008
作品 0
浦东
程序员
私信 提问
[Java并发系列] 5.Java并发工具类

在J.U.C包中,提供了几个非常有用的并发工具类,通过使用这些工具类,可以有效提高并发编程中,并发流程的控制,以提升效率和代码质量,如下: CountDownLatch CyclicBarrier Semaphore 1. ...

Xiangdong_She
2017/10/27
0
0
学习笔记六:线程间的协作与通信之并发工具类

继续 上一篇 《 学习笔记五:线程间的协作与通信》 在jdk的并发包里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Excha...

刘祖鹏
2018/07/26
19
0
【死磕Java并发】-----J.U.C之并发工具类:CyclicBarrier

此篇博客所有源码均来自JDK 1.8 CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程...

chenssy
2017/04/13
0
0
JAVA 并发体系概览

Java并发包主要有以下部分构成: 同步对象 主要提供多个线程以何种方式进行通信协作 执行器 管理多线程,提供线程运行入口 锁 控制线程访问资源的顺序 原子操作 对Java的基本类型进行了封装,...

二两豆腐
2016/12/19
85
0
Java中的并发工具类(CountDownLatch、CyclicBarrie、Exchanger)

在JDK的并发包里提供了很多有意思的并发工具类。CountDownLatch、CyclicBarrier和Semaphore 工具类提供了一种并发流程控制的手段,Exchanger 工具类则提供了在线程间交换数据的一种手段。 1....

孟飞阳
02/22
178
0

没有更多内容

加载失败,请刷新页面

加载更多

Taro 兼容 h5 踩坑指南

最近一周在改造 公羊阅读🐏 Taro 版本适配 h5 端,过程中改改补补,好不酸爽。 本文记录📝遇到的问题,希望为有相同需求的哥们👬节约点时间。 Taro 版本:1.3.9。 client_mobile_taro...

dkvirus
今天
4
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
今天
3
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
今天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
今天
19
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部