· 1. 等待多线程完成的CountDownLatch

构造函数接收一个int类型的参数作为计数器,如果想等待N个点,就传入N。当调用CountDownLatch的countDown方法时,N就会减一,直至减为零。使用await方法等待,当N的值变为零,执行await的线程继续执行。

public class CountDownTest {

    static CountDownLatch c = new CountDownLatch(2);
static ExecutorService pool = Executors.newFixedThreadPool(2); public static void main(String agrs[]){ pool.execute(new Runnable() {
public void run() {
try {
TimeUnit.MILLISECONDS.sleep(3);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("This is A");
c.countDown();
}
}); pool.execute(new Runnable() {
public void run() {
try {
TimeUnit.MILLISECONDS.sleep(3);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("This is B");
c.countDown();
}
}); try {
c.await();
}catch (InterruptedException e){ }
System.out.println("This is main");
}
}

2. 同步屏障CyclicBarrier

可循环使用的屏障。它要做的事情,让一组线程到达屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续运行。

默认构造方法CyclicBarrier(int parties),其参数表示屏障拦截的线程数,每个线程调用await方法告诉CyclicBarrier已经到达屏障,然后当前线程阻塞。

public class CylicBarrierTest {

    static CyclicBarrier c = new CyclicBarrier(2);

    static ExecutorService pool = Executors.newFixedThreadPool(2);

    public static void main(String args[]){

        pool.execute(new Runnable() {
public void run() {
System.out.println("this is A");
try {
c.await();
System.out.println("this is Aa");
}catch (Exception e){
e.printStackTrace();
}
}
}); pool.execute(new Runnable() {
public void run() {
System.out.println("this is B");
try {
c.await();
System.out.println("this is Bb");
}catch (Exception e){
e.printStackTrace();
}
}
}); pool.shutdown();
}
}

3. CountDownLatch vs CyclicBarrier

CountDownLatch的计数器只使用一次,而CyclicBarrier的计数器可以使用reset方法重置,重复使用

4. 控制线程并发数的信号量 Semaphore

控制有限哥线程使用资源。使用方法 Semaphore ss = new Semaphore(N), N表示最大的并发量,每个线程使用资源前调用ss.acquire()方法获取权限,使用完后调用ss.release()方法释放权限。

5. 线程间的数据交换Exchanger

它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。

public class ExchangeTest {

    private static final Exchanger<String> exgr = new Exchanger<String>();

    private static ExecutorService pool = Executors.newFixedThreadPool(2);

    public static void main(String args[]){

        pool.execute(new Runnable() {
public void run() {
String A = "银行流水A";
try {
A = exgr.exchange(A);
System.out.println("A 当前的值:" + A);
}catch (InterruptedException e){ }
}
}); pool.execute(new Runnable() {
public void run() {
String B = "银行流水B";
try {
B = exgr.exchange(B);
System.out.println("B 当前的值:" + B);
}catch (InterruptedException e){ }
}
}); pool.shutdown();
}

java中常用的并发工具类的更多相关文章

  1. java中常用的包、类、以及包中常用的类、方法、属性----sql和text\swing

    java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.sql.*; java.text.*; java.a ...

  2. java中excel导入\导出工具类

    1.导入工具 package com.linrain.jcs.test; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import ...

  3. java中的Arrays这个工具类你真的会用吗

    Java源码系列三-工具类Arrays ​ 今天分享java的源码的第三弹,Arrays这个工具类的源码.因为近期在复习数据结构,了解到Arrays里面的排序算法和二分查找等的实现,收益匪浅,决定研读 ...

  4. java多线程10:并发工具类CountDownLatch、CyclicBarrier和Semaphore

    在JDK的并发包(java.util.concurrent下)中给开发者提供了几个非常有用的并发工具类,让用户不需要再去关心如何在并发场景下写出同时兼顾线程安全性与高效率的代码. 本文分别介绍Coun ...

  5. java中定义一个CloneUtil 工具类

    其实所有的java对象都可以具备克隆能力,只是因为在基础类Object中被设定成了一个保留方法(protected),要想真正拥有克隆的能力, 就需要实现Cloneable接口,重写clone方法.通 ...

  6. Java中的集合Collections工具类(六)

    操作集合的工具类Collections Java提供了一个操作Set.List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集 ...

  7. java中文件操作的工具类

    代码: package com.lky.pojo; import java.io.BufferedReader; import java.io.BufferedWriter; import java. ...

  8. java中重要的多线程工具类

    前言 之前学多线程的时候没有学习线程的同步工具类(辅助类).ps:当时觉得暂时用不上,认为是挺高深的知识点就没去管了.. 在前几天,朋友发了一篇比较好的Semaphore文章过来,然后在浏览博客的时候 ...

  9. 在JAVA中自定义连接数据库的工具类

    为什么要自定义数据库连接的工具类: 在开发中,我们在对数据库进行操作时,必须要先获取数据库的连接,在上一篇随笔中提到的获取数据库连接的步骤为: 1.定义好4个参数并赋值 2.加载驱动类 3.获取数据库 ...

随机推荐

  1. Nuget常用命令操作

    Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中添加.移除和更新引 ...

  2. 自己编写jQuery动态引入js文件插件 (jquery.import.dynamic.script)

    这个插件主要是结合jquery或者xhr异步请求来使用的,它可以把已经引入过的js文件记录在浏览器内存中,当下次再引入相同的文件就忽略该文件的引入. 此插件不支持浏览器刷新保存数据,那需要利用cook ...

  3. Swift学习笔记(4):字符串

    目录: 初始化 常用方法或属性 字符串索引 初始化 创建一个空字符串作为初始值: var emptyString = "" // 空字符串字面量 var anotherEmptyS ...

  4. 【PHP】PHP从入门到精通(一)——想学习PHP的小伙伴的福利来了!

     PHP从精通到入门 (一)PHP简介和基本知识 PHP(外文名:PHP: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸 ...

  5. jmeter IP欺骗功能实现

    使用过loadrunner的同学,应该都了解有个IP欺骗功能,jmeter遇到类似需求怎样实现呢? 环境:windows7,jdk1.8,jmeter3.1 使用IP欺骗功能前提是本地有多个可用IP, ...

  6. Python下划线的使用

    References: [1]. http://python.jobbole.com/81129/ 本文将讨论Python中下划线(_)字符的使用方法.我们将会看到,正如Python中的很多事情,下划 ...

  7. 《Android进阶》之第二篇 launcher

    public boolean addViewToCellLayout(View child, int index, int childId, LayoutParams params, boolean ...

  8. SVN分支/合并原理及最佳实践

    转自:http://blog.csdn.net/e3002/article/details/21469437 使用svn几年了,一直对分支和合并敬而远之,一来是因为分支的管理不该我操心,二来即使涉及到 ...

  9. javaWeb学习总结(8)- JSP标签(6)

    一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...

  10. OpenCV探索之路(十五):角点检测

    角点检测是计算机视觉系统中用来获取图像特征的一种方法.我们都常说,这幅图像很有特点,但是一问他到底有哪些特点,或者这幅图有哪些特征可以让你一下子就识别出该物体,你可能就说不出来了.其实说图像的特征,你 ...