java中常用的并发工具类

· 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();
    }

原文地址:https://www.cnblogs.com/labimeilexin/p/9372039.html

时间: 2024-11-10 19:34:02

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

java中IO写文件工具类

下面是一些根据常用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 其中jodd中提供的JavaUtil类中提供的方法足够我们使用,里面的方法写的非常简练,例如append,read等方法,封装更好,更符合面向对象, 这里面我写的一些方法可多都是模仿jodd,从里面进行抽取出来的. /** * 获取路径文件夹下的所有文件 * @param path * @return */ public static File[] ge

java中常用的包、类、以及包中常用的类、方法、属性-----io包

由于最近有需要,所以下面是我整理的在开发中常用的包.类.以及包中常用的类.方法.属性:有需要的看看 java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.math.*; java.sql.*; java.text.*; java.awt.*; javax.swing.*;   包名 接口 类 方法 属性 java.io.*; java.io.Serializable实现序列化 java.io.Buffe

Java中常用的JSON工具

1.Java中常用的JSON工具 Gson: 谷歌开发的 JSON 库,功能十分全面. FastJson: 阿里巴巴开发的 JSON 库,性能十分优秀. Jackson: 社区十分活跃且更新速度很快. 2.以下教程基于 FastJson 讲解. 在 Maven 构建的项目中,在 pom.xml 文件中加入以下依赖即可. <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</a

java并发的艺术-读书笔记-第八章常用的并发工具类

jdk中提供了几个非常有用的工具类,分别是CountDownLatch,CyclicBarrier和semaphore exchanger CountDownLatch:允许一个或者多个线程等待其他线程完成操作 public class CountDownLatchTest{ static CountDownLatch c = new CountDownLatch(2); public static void main(String[] args){ new Thread(new Runnabl

java中excel导入\导出工具类

1.导入工具 1 package com.linrain.jcs.test; 2 3 4 import jxl.Cell; 5 import jxl.Sheet; 6 import jxl.Workbook; 7 import jxl.write.Label; 8 import jxl.write.WritableSheet; 9 10 import java.io.InputStream; 11 import java.lang.reflect.Field; 12 import java.te

java中常用的包和类

1.java.lang:语言包 2.java.util:实用包 3.java.awt:抽象窗口工具包  4.java.io:输入输出包 ①.java.lang:语言包 这是Java语言的核心包,系统自动将这个包引入到用户程序,该包中主要类有: 1.object类:它是所有类的父类,其中定义的方法其它类都可以使用. 2.数据类型包装类:简单的数据类型的类包装,包括Integer.Float.Boolean等. 3.数学类Math:提供常量和数学函数,包括E和PI常数及abs().sin().cos

JAVA中使用MD5加密工具类实现对数据的加密处理

1.MD5工具类 package com.ssm.util; import java.security.MessageDigest; public class MD5Util { //将字节数组转成十六进制字符串 private static String byteArrayToHexString(byte b[]) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++) resultSb.

Java中Date类型的工具类

package com.mytripod.util; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * @author Mytripod * @create 2018-09-30 21:25 */ public class DateUtil { public static String DatePattern

java中常用的工具类(二)

下面继续分享java中常用的一些工具类,希望给大家带来帮助! 1.FtpUtil Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71