java 信号量Semaphore的使用

2024-09-03 00:48

本文主要是介绍java 信号量Semaphore的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

java 信号量Semaphore的使用

信号量是一种计数器,用来保护一个或者多个共享资源的访问。

信号量的使用:

(1)如果一个线程要访问一个共享资源,他必须先获得信号量。如果信号量的内部计数器大于0,信号量将减1,然后允许访问这个共享资源。计数器大于0意味着又可以使用的资源,因此线程讲被允许使用其中一个资源。

(2)如果信号量等于0,信号将将会把线程植入休眠直到计数器大于0.计数器等于0的时候意味着所有的共享资源已经被其他线程使用了,所以需要访问这个共享资源的线程必须等待。

(3)当线程使用完这个共享资源时,信号量必须被释放,以便其他线程能够访问共享资源,释放操作将使用信号量的内部计数器增加1。

本节教你,在java中如何实现java的Semaphore信号量类,主要用到Semaphore类的acquire()方法和release()方法,分别是获取资源和释放资源的意思,最后我会解释Semaphore类的源码作分析。

我们的演示例子功能是:我们将实现一个打印队列,并发任务将使用它来完成打印。这个打印队列受信号量保护,因而同一时刻只有一个线程可以执行打印。

代码如下:

package test1;import java.util.concurrent.Semaphore;public class SemaphoreDemo {public static void main(String[] args) {PrintQueue printQueue = new PrintQueue();Thread thread[] = new Thread[10];for (int i = 0; i < 10; i++) {thread[i] = new Thread(new Job(printQueue),"Thread"+i);}for (int i = 0; i < 10; i++) {thread[i].start();}}}class PrintQueue {private final Semaphore semaphore;public PrintQueue() {semaphore = new Semaphore(1);//这是一个二进制信号量哦,计数器值只能是0或者1;}public void printJob (Object document) {try {semaphore.acquire();//获取共享资源,如果计数器为0会等待long duration = (long) (Math.random()*10);System.out.printf("%s: PrintQueue: Printing a job during %d seconds \n",Thread.currentThread().getName(),duration);Thread.sleep(duration);} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();//放在finally语句块表示不管发不发生异常都会执行,都会释放资源。}}
}class Job implements Runnable {private PrintQueue printQueue;public Job(PrintQueue printQueue) {this.printQueue = printQueue;}@Override public void run() {System.out.printf("%s: Going to print a job\n",Thread.currentThread().getName());printQueue.printJob(new Object());System.out.printf("%s: The document has been printed\n",Thread.currentThread().getName());}
}

输出结果:

Thread1: Going to print a job
Thread9: Going to print a job
Thread8: Going to print a job
Thread7: Going to print a job
Thread5: Going to print a job
Thread3: Going to print a job
Thread6: Going to print a job
Thread4: Going to print a job
Thread2: Going to print a job
Thread0: Going to print a job
Thread1: PrintQueue: Printing a job during 4 seconds 
Thread1: The document has been printed
Thread9: PrintQueue: Printing a job during 6 seconds 
Thread9: The document has been printed
Thread8: PrintQueue: Printing a job during 4 seconds 
Thread8: The document has been printed
Thread7: PrintQueue: Printing a job during 6 seconds 
Thread7: The document has been printed
Thread5: PrintQueue: Printing a job during 3 seconds 
Thread5: The document has been printed
Thread3: PrintQueue: Printing a job during 2 seconds 
Thread3: The document has been printed
Thread6: PrintQueue: Printing a job during 9 seconds 
Thread6: The document has been printed
Thread4: PrintQueue: Printing a job during 3 seconds 
Thread4: The document has been printed
Thread2: PrintQueue: Printing a job during 1 seconds 
Thread2: The document has been printed
Thread0: PrintQueue: Printing a job during 3 seconds 
Thread0: The document has been printed


仔细看看结果哦,一开始大家都在等待,只能一个一个打印哦;



这篇关于java 信号量Semaphore的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131546

相关文章

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

SpringBoot整合OpenFeign的完整指南

《SpringBoot整合OpenFeign的完整指南》OpenFeign是由Netflix开发的一个声明式Web服务客户端,它使得编写HTTP客户端变得更加简单,本文为大家介绍了SpringBoot... 目录什么是OpenFeign环境准备创建 Spring Boot 项目添加依赖启用 OpenFeig