Semaphore 使用详解

简介: 本文主要对Semaphore 的相关知识点进行了介绍和讲解

一、什么是Semaphore

Semaphore [ˈsɛməˌfɔr] 信号量,是JUC包下的一个工具类,它用于控制同时访问特定资源的线程数量,控制并发线程数。

Semaphore两个重要的方法

  • semaphore.acquire(): 请求一个信号量,这时候的信号量个数-1(一旦没有可使用的信号量,也即信号量个数变为负数时,再次请求的时候就会阻塞,直到其他线程释放了信号量)
  • semaphore.release():释放一个信号量,此时信号量个数+1

二、使用场景

我们可以通过其限制执行的线程数量,达到限流的效果

当一个线程执行时先通过其方法进行获取许可操作,获取到许可的线程继续执行业务逻辑,当线程执行完成后进行释放许可操作,未获取达到许可的线程进行等待或者直接结束。

三、代码实现

publicclassSemaphoreCase {
publicstaticvoidmain(String[] args) {
// 1. 创建 semaphore 对象Semaphoresemaphore=newSemaphore(2);
// 2. 5个线程同时运行for (inti=0; i<5; i++) {
newThread(() -> {
try {
// 3. 获取许可semaphore.acquire();
                } catch (InterruptedExceptione) {
e.printStackTrace();
                }
try {
System.out.println(Thread.currentThread().getName() +"running...");
try {
Thread.sleep(1000);
                    } catch (InterruptedExceptione) {
e.printStackTrace();
                    }
System.out.println(Thread.currentThread().getName() +"end...");
                } finally {
// 4. 释放许可semaphore.release();
                }
            }).start();
        }
    }
}

四、打印结果

Thread-1running...
Thread-0running...
Thread-1end...
Thread-0end...
Thread-2running...
Thread-3running...
Thread-3end...
Thread-2end...
Thread-4running...
Thread-4end...
Processfinishedwithexitcode0
相关文章
|
11月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
514 83
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
443 0
|
设计模式 运维 监控
并发设计模式实战系列(4):线程池
需要建立持续的性能剖析(Profiling)和调优机制。通过以上十二个维度的系统化扩展,构建了一个从。设置合理队列容量/拒绝策略。动态扩容/优化任务处理速度。检查线程栈定位热点代码。调整最大用户进程数限制。CPU占用率100%
693 0
|
11月前
|
存储 Java 调度
Java虚拟线程:轻量级并发的革命性突破
Java虚拟线程:轻量级并发的革命性突破
556 83
|
8月前
|
设计模式 缓存 安全
【JUC】(6)带你了解共享模型之 享元和不可变 模型并初步带你了解并发工具 线程池Pool,文章内还有饥饿问题、设计模式之工作线程的解决于实现
JUC专栏第六篇,本文带你了解两个共享模型:享元和不可变 模型,并初步带你了解并发工具 线程池Pool,文章中还有解决饥饿问题、设计模式之工作线程的实现
558 2
|
9月前
|
存储 Oracle Java
|
11月前
|
Java
创建线程的方法
Java中实现多线程有四种方式:1. 继承Thread类,简单但占用继承机会,耦合度高;2. 实现Runnable接口,推荐方式,任务与线程解耦,支持Lambda;3. 实现Callable接口配合FutureTask,可获取返回值和异常;4. 使用线程池(ExecutorService),企业推荐,管理线程生命周期,提升性能,支持多种线程池类型。
314 1
|
存储 缓存 安全
JUC并发—11.线程池源码分析
本文主要介绍了线程池的优势和JUC提供的线程池、ThreadPoolExecutor和Excutors创建的线程池、如何设计一个线程池、ThreadPoolExecutor线程池的执行流程、ThreadPoolExecutor的源码分析、如何合理设置线程池参数 + 定制线程池。
JUC并发—11.线程池源码分析
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
824 5

热门文章

最新文章