· 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. 根据优先关系矩阵使用逐次加一发构造优先函数(Java)

    若已知运算符之间的优先关系,可按如下步骤构造优先函数: 1.对每个运算符a(包括#在内)令f(a)=g(a)=1 2.如果a⋗b且f(a)<=g(b)令f(a)=g(b)+1 3.如果a⋖b且f ...

  2. 从Python小白到第一个小游戏发布

    1.安装必要的环境(附图两张) 直接下载安装程序,本人win10系统,根据电脑系统下载并安装对应的python.exe,安装路径可以选择D盘的,具体安装细节这里就不说了,不知道的可以留言或者找度娘 2 ...

  3. Microsoft Windows 2003 SP2 - 'ERRATICGOPHER' SMB Remote Code Execution

    EDB-ID: 41929 Author: vportal Published: 2017-04-25 CVE: N/A Type: Remote Platform: Windows Aliases: ...

  4. 栈的Java简单实现

    关于栈 栈(Stack)是限定只能在一段进行插入和删除操作的线性表. 进行插入和删除操作的一端称为“栈顶”(top),另一端称为“栈底”(bottom). 栈的插入操作称为“入栈”(push),栈的删 ...

  5. Oracle 12C 新特性之 PDB热克隆(本地克隆、远端异机克隆)

    说明:版本12.2.0.1 12c r1版本中 clone 一份PDB源库需要打开在read only只读模式 , 在12c r2版本中引入了local undo mode, 源PDB在read/wr ...

  6. java中几种获取项目路径方式

    转自http://caodaoxi.iteye.com/blog/1234805     在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录 ...

  7. axis2 和 xfire 接口调用问题排查

    背景: 1个运营商厂家开发人员离职,我们为了上线对接接口,迁就对方客户端调用.对方客户端框架用的是xfire.调用方式基本为:   Service serviceModel = new ObjectS ...

  8. cas4.2.7 取消https

    cas.properties 修改两个地方 # Decides whether SSO cookie should be created only under secure connections. ...

  9. shell中如何进行算术运算

    A=3 B=6 1.let算术运算表达式 let C=$A+$B2.$[算术运算表达式] C=$[$A+$B] 3.$(()) C=$(($A+$NB))

  10. OpenGL教程(0)——介绍

    OpenGL介绍 OpenGL,全称Open Graphics Library,是一个用C语言写的图形API.通俗地说,OpenGL用来绘制2D/3D图形.目前OpenGL的运用十分广泛,有许多用Op ...