Semaphore和Exchanger

简介: Semaphore和Exchanger

公众号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();
    }
}

640.png


双十一课程活动详情

奔跑的小梁,公众号:梁霖编程工具库leetcode刷题直播教学,手把手带你刷题,双十一优惠价来啦~~

相关文章
|
Java BI
CountDownLatch,CyclicBarrier,Semaphore
在开发过程中我们常常遇到需要对多个任务进行汇总,比如报表,或者大屏显示,需要将所有接口的数据都 获取到后再进行汇总,如果使用同步的方式,那么会比较耗时,体验不好,所以我们使用多线程,但是使用多线程 只能异步的执行,有些接口响应比较快,有些比较慢,而返回结果之间又有依赖,这样就无法汇总了, 所以我们引入了CountDownLatch,它能让所有子线程全部执行完毕后主线程才会往下执行,如果子线程没有执行完毕 ,那么主线程将无法继续向下执行。
57 0
Semaphore 使用详解
本文主要对Semaphore 的相关知识点进行了介绍和讲解
86 0
|
5月前
|
存储 Java 数据库连接
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
63 0
|
5月前
|
数据库连接
认识 Semaphore
认识 Semaphore
41 0
|
5月前
|
Java
JUC 常用 4 大并发工具类 CountDownLatch、CyclicBarrier、Semaphore、ExChanger
JUC 常用 4 大并发工具类 CountDownLatch、CyclicBarrier、Semaphore、ExChanger
|
5月前
|
安全 Java C++
多线程之Callable接口、ReentrantLock、信号量 Semaphore以及CountDownLatch
多线程之Callable接口、ReentrantLock、信号量 Semaphore以及CountDownLatch
|
Java 数据库连接 API
【JUC】信号量Semaphore详解
【JUC】信号量Semaphore详解
164 0
【JUC】信号量Semaphore详解
|
Java
呵,Semaphore ,就这?(二)
那么本篇文章我们继续来和你聊聊并发工具类的第二篇文章 --- Semaphore 。
119 0
呵,Semaphore ,就这?(二)
|
监控 数据库连接
呵,Semaphore ,就这?(一)
那么本篇文章我们继续来和你聊聊并发工具类的第二篇文章 --- Semaphore 。
122 0
呵,Semaphore ,就这?(一)
CountDownLatch&CyclicBarrier&Semaphore
本文将介绍一下CountDownLatch 、 CyclicBarrier 、 Semaphore这几个控制线程的类。
 CountDownLatch&CyclicBarrier&Semaphore