面试必问! JUC 常用 4 大并发工具类是哪几个?( 五 )


通过执行结果可以很明确的看到,一上来就有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 大并发工具类是哪几个?】通过执行结果可以清晰的看到,两个线程中的数据发生了交换,这就是的线程数据交换了 。