JDK提供的并发工具类
1.CountDownLatch
await(),进入等待的状态
countDown(),计数器减一
应用场景:启动三个线程计算,需要对结果进行累加。
/**
 *
 * CountDownLatch Demo
 *
 */
public class CountDownLatchDemo {
    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(8);
        new Thread(()->{
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("800米比赛结束,准备清空跑道并继续跨栏比赛");
        }).start();
        for (int i = 0; i < 8; i++) {
            final  int finalI = i;
//            System.out.println("fin->"+finalI);
            new Thread(()->{
                try {
                    Thread.sleep(finalI * 1000L);
                    System.out.println(Thread.currentThread().getName()+"到达终点了");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    countDownLatch.countDown();
                }
            }).start();
        }
    }
}
2.CyclicBarrier--栅栏
允许一组线程相互等待达到一个公共的障碍点,之后再继续执行
跟countDownLatch的区别
CountDownLatch一般用于某个线程等待若干个其他线程执行完任务之后,它才执行;不可重复使用
CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;可重用的
/**
 * 栅栏系统
 */
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(8);
        for (int i = 0; i < 8; i++) {
            int finalI = i;
            new Thread(()->{
                try {
                    Thread.sleep(finalI *1000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"准备就绪");
                try {
                    cyclicBarrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("开始比赛");
            }).start();
        }
    }
}
3.Semaphore--信号量
控制并发数量
使用场景:接口限流
/**
 * Semaphore
 * 控制进来的最多的线程数量 等释放后才允许后续的进来
 */
public class SemaphoreDemo {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(8);
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"开始执行");
                    Thread.sleep(5000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    //最后需要释放
                    semaphore.release();
                }
            }).start();
        }
    }
}
4.Exchanger
用于交换数据
它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,
如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点
时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。因此使用Exchanger的重点是成对的
线程使用exchange()方法,当有一对线程达到了同步点,就会进行交换数据。因此该工具类的线程对象是【成
对】的。
/**
 * Exchanger 线程间的数据交换
 * 交换线程数量必须成对
 *
 */
public class ExchangerDemo {
    public static void main(String[] args) {
        Exchanger<String> stringExchanger = new Exchanger<>();
        String str1 = "str001";
        String str2 = "str002";
        new  Thread(()->{
            System.out.println(Thread.currentThread().getName()
            +"初始化的数据==>"+str1
            );
            try {
                //开始交换数据
                String exchange = stringExchanger.exchange(str1);
                System.out.println(Thread.currentThread().getName()
                        +"交换后的数据==>"+exchange
                );
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"线程1").start();
        new  Thread(()->{
            System.out.println(Thread.currentThread().getName()
                    +"初始化的数据==>"+str2
            );
            try {
                //开始交换数据
                String exchange = stringExchanger.exchange(str2);
                System.out.println(Thread.currentThread().getName()
                        +"交换后的数据==>"+exchange
                );
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"线程2").start();
    }
}
JDK提供的并发工具类的更多相关文章
- java并发学习--第七章 JDK提供的线程工具类
		一.ThreadLocal ThreadLocal类用于隔离多线程中使用的对象,为ThreadLocal类中传递的泛型就是要隔离的对象,简单的来说:如果我们在主线程创建了一个对象,并且需要给下面的多线 ... 
- JDK并发工具类
		在JDK的并发包里提供了几个非常有用的并发工具类.CountDownLatch.CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程 ... 
- 并发工具类:CountDownLatch、CyclicBarrier、Semaphore
		在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ... 
- java中的并发工具类
		在jdk的并发包里提供了几个非常有用的并发工具类.CountDownLatdch.CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线 ... 
- Java中的并发工具类(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
		在JDK的并发包里提供了很多有意思的并发工具类.CountDownLatch.CyclicBarrier和Semaphore 工具类提供了一种并发流程控制的手段,Exchanger 工具类则提供了在线 ... 
- Java并发编程-并发工具类及线程池
		JUC中提供了几个比较常用的并发工具类,比如CountDownLatch.CyclicBarrier.Semaphore. CountDownLatch: countdownlatch是一个同步工具类 ... 
- 并发工具类(一)等待多线程的CountDownLatch
		前言 JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ... 
- 并发工具类(二)同步屏障CyclicBarrier
		前言 JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ... 
- 并发工具类(三)控制并发线程的数量 Semphore
		前言 JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ... 
随机推荐
- Android Studio 之 LiveData 的配合使用,底层数据变化,自动通知界面
			Android Studio 之 LiveData 的配合使用,底层数据变化,自动通知界面 viewModelWithLikeData.getLikeNumber().observe(this, ne ... 
- 数据结构(一)二叉树 & avl树 & 红黑树 & B-树 & B+树 & B*树 & R树
			参考文档: avl树:http://lib.csdn.net/article/datastructure/9204 avl树:http://blog.csdn.net/javazejian/artic ... 
- CSS Blur() 将高斯模糊应用于输出图片
			一.Css Blur() blur() CSS 方法将高斯模糊应用于输出图片. 结果为 <filter-function>. blur(radius) radius模糊的半径,值为< ... 
- sshfs+overlayfs实现一个共享只读资源被多个主机挂载成可写目录
			sshfs+overlayfs实现一个共享只读资源被多个主机挂载成可写目录 1.sshfs -o ssh_command='sshpass -p '"${passwd}"' ssh ... 
- Android Studio 3.4 修改 .android 和.gradle缺省目录-windows7x64专业版环境。
			说明:缺省会在用户目录建立.android和.gradle目录.会挤满C盘.可以改变缺省目录. 改变.gradle目录路径示例,修改到D:\android目录,步骤: 1.建立d:\android目录 ... 
- python开发笔记-str转字典
			后台接收到post请求数据格式为json格式的字符串,不能直接用字典的get方法 909090909090909090909090909090909 Internal Server Error: /g ... 
- sed 变量在shell引用
			#!/bin/bashZipName=`ls -lt /data/office_services/*.zip | head -1 | awk -F"/" '{print $NF}' ... 
- 2019 GDD TensorFlow
			https://www.tensorflow.org/ https://tensorflow.google.cn/ (中文站点) 现场PPT照片: https://pan.baidu.c ... 
- [转].gitignore文件不起作用的解决方案
			.gitignore文件不起作用的解决方案 觉得有用的话,欢迎一起讨论相互学习~Follow Me 转载地址 https://www.cnblogs.com/liugp/p/10399282.html ... 
- JS调用onBackPressed
			需求: 安卓页面webview加载H5页面,H5页面能能返回到安卓页面 import android.os.Bundle; import android.support.v7.app.AppCompa ... 
