java并发包下的并发工具类

Hdaydayup 2017-12-05 原文

java并发包下的并发工具类

1.Exchanger

功能:用于线程间数据的交换

应用场景:1)遗传算法,目前还不是特别理解  2)校对工作,假设A,B线程做同一件任务,可以通过数据校验判断两线程是否正确的工作

例子:是一个简单的校对工作例子

public class TestExchanger {
    public static void main(String[] args) {
        Exchanger<String> exchanger = new Exchanger<>();
        ExecutorService es = Executors.newFixedThreadPool(2);  //拥有两个线程的线程池
        es.execute(new Runnable() {
            @Override
            public void run() {
                String A = "银行流水A";
                try {
                    exchanger.exchange(A);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        es.execute(new Runnable() {
            @Override
            public void run() {
                String B = "银行流水B";
                try {
                    String A = exchanger.exchange(B);
                    System.out.println("A和B数据是否一致: " + A.equals(B) + ",A: " + A + ",B: " + B);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

Exchanger类中最重要的一个方法就是exchange(),该方法用于交换信息,并且接受来自另外一个线程的数据,exchange()方法里面还可以加参数。exchange(V x,long timeout,TimeUnit unit)设置一个最大等待时间避免一直等待

注意:信息交换是在同步点(Exchager提供一个同步点)进行交换,而不是两个线程调用了exchange()方法就进行交换。

底层实现:Lock+Condition,暂时还没深入,学习了进行补充

 

2.Semaphore

功能:控制同时访问特定资源的线程数量

应用场景:流量控制,比如数据库的连接

例子:

public class TestSemaphore {
    public static void main(String[] args) {
        // 线程池
        ExecutorService exec = Executors.newCachedThreadPool();
        //一次只能5个线程同时访问
        final Semaphore semp = new Semaphore(5);
        // 模拟20个客户端访问
        for (int index = 0; index < 20; index++) {
            final int NO = index;
            Runnable run = new Runnable() {
                public void run() {
                    try {
                        // 获取许可
                        semp.acquire();
                        System.out.println("Accessing: " + NO);
                        Thread.sleep((long) (Math.random() * 10000));
                        // 访问完后,释放
                        semp.release();
                        System.out.println("-----------------"+semp.availablePermits());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }

            };
            exec.execute(run);
        }

        // 退出线程池
        exec.shutdown();

    }
}

同时有五个线程可以执行,获取资源后打印语句后随机睡眠,最后释放资源,semp.availablePermits(),可以获得的许可数量,释放一个后将有一个没有被分发的许可证,当有多的许可证时,会采取先到先得的方式分配许可

Semaphore有两个构造函数,Semaphore(int)和Semaphore(int,boolean)。参数中的int表示该信号量拥有的许可数量,boolean表示获取许可的时候是否是公平的,如果是公平的那么,当有多个线程要获取许可时,会按照线程来的先后顺序分配许可,否则,线程获得许可的顺序是不定的

 

3.CyclicBarrier

功能:控制同时访问特定资源的线程数liasa

应用场景:流量控制,比如数据库的连接

例子:

 

发表于 2017-12-05 13:27 甜甜咿呀咿呀哟 阅读() 评论() 编辑 收藏

 

版权声明:本文为Hdaydayup原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://www.cnblogs.com/Hdaydayup/p/7986433.html

java并发包下的并发工具类的更多相关文章

  1. java学习 学生管理系统-v6.0 多态

    java学习 学生管理系统-v6.0 本次将使用多态来对上次的学生管理系统-v5.0进行改进。 多态 多态的概 […]...

  2. Java基础学习(五)– Java中常用的工具类、枚举、Java中的单例模式之详解

    Java中的常用类 1.Math : 位于java.lang包中 (1)Math.PI:返回一个最接近圆周率的 […]...

  3. Java基础学习(四)– 接口、集合框架、Collection、泛型详解

      接口   一、接口的基本概念   关键字为:Interface,在JAVA编程语言中是一个抽象类型,是抽象 […]...

  4. RMI之由浅入深(一)

    0x01、什么是RMI RMI(Remote Method Invocation)即Java远程方法调用,RM […]...

  5. Java零基础学习(三)

      1.封装:将属性私有化,通过公共方法来访问,确保安全性。     this的含义:对象本身,自己。   2 […]...

  6. 十年Java开发程序员回答,自学Java,培训Java的利和弊

    最近有一个朋友在群里面问我:是应该去培训Java还是应该自学Java,我想的说的是我并不是想给他一个去培训或者 […]...

  7. Java注解与反射

    本文主要是总结Java注解与反射的相关知识。 概要 本文主要是总结Java注解与反射的相关知识,加深自己对Ja […]...

  8. 零基础新手学习Java必须知道的市场行情

    Java如今的市场不如从前,竞争很大,工资非常高,标准非常高,想要胜任一份高薪的工作不是那么容易,只有掌握最新 […]...

随机推荐

  1. 客户关系管理及客户服务简介(译)

    本文为《Services with SAP CRM》的第一章的简单翻译,原文在这里大部分可以看到。看完之后觉得 […]...

  2. Maven项目打包成war包部署到Tomcat的方法

    有关于 Maven 项目的打包部署,我这里用的是 Eclipse 编辑器,以此来做个简单的记录。 实践环境 操 […]...

  3. 用于浏览器本地存储的js插件 – jStorage

    jStorage是一个跨浏览器的将key-value类型的数据存储到浏览器本地存储的js插件——jStorag […]...

  4. Java线程状态和关闭线程的正确姿势

    1、线程状态及切换   Java中的线程有六种状态,使用线程Thread内的枚举类来实现,如下,我对每个状态都 […]...

  5. HBase单机模式部署

    1.上传&解压    2.设置环境变量    3.启用&检验    4.编辑hbase-env […]...

  6. 一套测试用例如何实现支持多个环境运行

    一套测试用例如何实现支持多个环境运行 2020-05-13 17:18  狂师  阅读(…)  评 […]...

  7. Archlinux安装笔记-安装基础系统

    一.首先打开archlinux的安装界面后选择第一项(Boot Arch Linux) 二.进行联网 1.链接 […]...

  8. UE4蓝图编程的第一步

    UE4蓝图编程的第一步 认识UE4蓝图中颜色与变量类型: UE4中各个颜色对应着不同的变量,连接点和连线的颜色 […]...

展开目录

目录导航