公众号merlinsea
- Semaphore
- Semaphore信号量:用于约束在一个jvm中最多同时有多少个线程可以并发执行,即可以控制并发数量。
- 应用场景:主要用于单jvm中的接口限流。
- 关于信号量的核心操作:
- 在线程内代码执行前先尝试获取信号量
- 在线程内代码执行完毕或者出现异常的时候归还信号量。
public class SemaphoreDemo { public static void main(String[] args) { //一共有8个信号量 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(); } } }
- Exchanger
- 为单JVM实例的成对线程提供一个同步点,当两个线程都到达这个这个同步点上就可以交换数据,这两个线程通过执行exchange(msg)方法交换自己的数据,如果一个线程先执行exchange()方法,那么这个线程会在这个方法处一直等待到第二个线程执行到这个方法时就交换数据。
- 因此使用Exchanger的线程必须【成双】出现,否则会导致有一个线程阻塞在exchange方法。
public class ExchangerDemo { public static void main(String[] args) { Exchanger<String> stringExchanger = new Exchanger<>(); new Thread(() -> { String str1 = "线程1的原始消息"; System.out.println(Thread.currentThread().getName() + "初始值==========>" + str1); try { //线程1先执行,因此会在这个地方等待线程2 String exchange = stringExchanger.exchange(str1); System.out.println(Thread.currentThread().getName() + "交換后的数据==========>" + exchange); } catch (InterruptedException e) { e.printStackTrace(); } }, "线程1").start(); try { Thread.sleep(4000L); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(() -> { String str2 = "线程2的原始消息"; System.out.println(Thread.currentThread().getName() + "初始值==========>" + str2); try { //线程2执行到这里就会发生交换数据 String exchange = stringExchanger.exchange(str2); System.out.println(Thread.currentThread().getName() + "交換后的数据==========>" + exchange); } catch (InterruptedException e) { e.printStackTrace(); } }, "线程2").start(); } }
双十一课程活动详情
奔跑的小梁,公众号:梁霖编程工具库leetcode刷题直播教学,手把手带你刷题,双十一优惠价来啦~~