通过执行结果可以很明确的看到,一上来就有10个线程获取到了连接,,然后后面的40 个线程进入阻塞,然后只有释放链接之后,等待的线程就会有一个拿到,然后越后面的线程等待的时间就越长,然后一直到所有的线程执行完毕
最后打印的可用连接有九个不是因为少了一个是因为在释放之前打印的,不是错误
从结果中可以看到,我们对连接池中的资源的到了控制,这就是信号量的流量控制
「:」
,俗称交换器,用于在线程之间交换数据,但是比较受限,因为只能两个线程之间交换数据
/*** Creates a new Exchanger.*/public Exchanger() {participant = new Participant();}
这个构造函数没有什么好说的,也没有入参,只有在创建的时候指定一下需要交换的数据的泛型即可,下面看代码
package org.dance.day2.util;import java.util.HashSet;import java.util.Set;import java.util.concurrent.Exchanger;/*** 线程之间交换数据* @author ZYGisComputer*/public class UseExchange {private static final Exchanger> exchanger = new Exchanger<>();public static void main(String[] args) {new Thread(){@Overridepublic void run() {Set aSet = new HashSet<>();aSet.add("A");aSet.add("B");aSet.add("C");try {Set exchange = exchanger.exchange(aSet);for (String s : exchange) {System.out.println("aSet"+s);}} catch (InterruptedException e) {e.printStackTrace();}}}.start();new Thread(){@Overridepublic void run() {Set bSet = new HashSet<>();bSet.add("1");bSet.add("2");bSet.add("3");try {Set exchange = exchanger.exchange(bSet);for (String s : exchange) {System.out.println("bSet"+s);}} catch (InterruptedException e) {e.printStackTrace();}}}.start();}}
执行结果:
bSetAbSetBbSetCaSet1aSet2aSet3
【面试必问!JUC 常用 4 大并发工具类是哪几个?】通过执行结果可以清晰的看到,两个线程中的数据发生了交换,这就是的线程数据交换了 。
- 7 java并发编程实战 并发工具JUC之CountDownLatch
- 数据挖掘和机器学习20个面试问题
- 持续更新ing 软件测试面试常见问题总结
- 这1000道JAVA面试题,刷完50%妥妥的也能上岸
- 持续更新 2021大厂技术面100道MySQL经典面试题分享
- 2020年Java篇:蚂蚁金服,这10个经典又容易被人疏忽的JVM面试题
- 干货献上 2019年蚂蚁金服、头条、拼多多的面试总结
- 2019年Java篇:蚂蚁金服、拼多多、字节跳动的面试总结
- 纯干货献上 2020蚂蚁金服、头条、拼多多的面试总结
- 面试官:有一种数据类型,Redis 要存两次,为什么?