Java多线程Semaphore工具的使用详解

Java多线程Semaphore工具的使用详解

Semaphore是Java中的一个线程同步工具,可以用于控制线程的并发数,也可以用于多个线程之间的互斥访问。

Semaphore的特性

Semaphore主要有以下特性:

  • 控制并发数:Semaphore可以限制并发线程数,保证同时运行的线程数量不超过Semaphore的指定值。
  • 互斥访问:Semaphore可以用于控制对于共享资源的互斥访问。
  • 不可重入性:Semaphore是不可重入的,即同一个线程多次申请Semaphore锁时会阻塞。

Semaphore的方法

Semaphore类主要有以下方法:

  • acquire():申请一个Semaphore的锁。
  • acquire(int permits):申请指定数量的Semaphore锁。
  • tryAcquire():尝试申请一个Semaphore的锁。
  • tryAcquire(long timeout, TimeUnit unit):尝试申请一个Semaphore的锁,最多等待指定时间。
  • release():释放一个Semaphore的锁。
  • release(int permits):释放指定数量的Semaphore锁。

示例1:控制线程并发数

下面是一个示例,用Semaphore来限制线程的并发数为3:

public class Example1 {
    private static final int THREAD_COUNT = 10;
    private static final int THREAD_LIMIT = 3;
    private static Semaphore semaphore = new Semaphore(THREAD_LIMIT);

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < THREAD_COUNT; i++) {
            executorService.execute(() -> {
                try {
                    semaphore.acquire();
                    System.out.println("Thread " + Thread.currentThread().getName() + " is running");
                    TimeUnit.SECONDS.sleep(2);
                    semaphore.release();
                    System.out.println("Thread " + Thread.currentThread().getName() + " released the lock");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        executorService.shutdown();
    }
}

输出结果为:

Thread pool-1-thread-1 is running
Thread pool-1-thread-3 is running
Thread pool-1-thread-2 is running
Thread pool-1-thread-2 released the lock
Thread pool-1-thread-1 released the lock
Thread pool-1-thread-3 released the lock
Thread pool-1-thread-5 is running
Thread pool-1-thread-4 is running
Thread pool-1-thread-6 is running
Thread pool-1-thread-4 released the lock
Thread pool-1-thread-5 released the lock
Thread pool-1-thread-6 released the lock
Thread pool-1-thread-8 is running
Thread pool-1-thread-7 is running
Thread pool-1-thread-9 is running
Thread pool-1-thread-7 released the lock
Thread pool-1-thread-8 released the lock
Thread pool-1-thread-9 released the lock
Thread pool-1-thread-10 is running
Thread pool-1-thread-10 released the lock

示例2:控制对共享资源的互斥访问

下面是一个示例,用Semaphore来控制对于共享资源的互斥访问:

public class Example2 {
    private static final int THREAD_COUNT = 10;
    private static Semaphore semaphore = new Semaphore(1);

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < THREAD_COUNT; i++) {
            executorService.execute(() -> {
                try {
                    semaphore.acquire();
                    System.out.println("Thread " + Thread.currentThread().getName() + " is accessing the shared resource");
                    TimeUnit.SECONDS.sleep(2);
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        executorService.shutdown();
    }
}

输出结果为:

Thread pool-1-thread-1 is accessing the shared resource
Thread pool-1-thread-1 released the lock
Thread pool-1-thread-2 is accessing the shared resource
Thread pool-1-thread-2 released the lock
Thread pool-1-thread-3 is accessing the shared resource
Thread pool-1-thread-3 released the lock
Thread pool-1-thread-4 is accessing the shared resource
Thread pool-1-thread-4 released the lock
Thread pool-1-thread-5 is accessing the shared resource
Thread pool-1-thread-5 released the lock
Thread pool-1-thread-7 is accessing the shared resource
Thread pool-1-thread-7 released the lock
Thread pool-1-thread-6 is accessing the shared resource
Thread pool-1-thread-6 released the lock
Thread pool-1-thread-9 is accessing the shared resource
Thread pool-1-thread-9 released the lock
Thread pool-1-thread-10 is accessing the shared resource
Thread pool-1-thread-10 released the lock
Thread pool-1-thread-8 is accessing the shared resource
Thread pool-1-thread-8 released the lock

总结

通过Semaphore可以控制并发线程数,保证程序的可靠性和稳定性。同时,Semaphore还可以用于控制对于共享资源的互斥访问。在使用Semaphore时,应该根据具体场景确定Semaphore的数量和使用方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程Semaphore工具的使用详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 详解APP微信支付(java后台_统一下单和回调)

    详解APP微信支付(java后台_统一下单和回调) 一、前言 在移动APP中,使用微信支付功能是非常常见的需求,而且使用微信支付也是比较方便和快捷的。本文将详细介绍如何在Java后台中实现微信支付的功能。主要包括两部分:统一下单和回调。本文介绍的支付接口都是官方的API接口,并采用了最新的V3版本。 二、统一下单 下单接口是微信支付功能的核心,接口名称为:h…

    Java 2023年5月27日
    00
  • Java中filter用法完整代码示例

    下面就介绍一下Java中filter用法完整代码示例的攻略。 什么是Filter? Filter是JavaWeb中的一种函数式接口,可以用于对请求、响应进行过滤处理。Filter实现了一种常见的设计模式——责任链模式。 Filter可以用于请求预处理、响应后处理、用户权限验证、编码格式转换、日志记录等等。 Filter使用步骤 创建Filter类并实现jav…

    Java 2023年5月20日
    00
  • jsp下页面跳转的几种方法小结

    JSP下页面跳转的几种方法小结 1. 概述 在开发JSP应用程序的过程中,页面跳转是经常需要用到的功能。本文将介绍JSP下页面跳转的几种方法,包括: 使用超链接跳转 使用表单提交数据并跳转 使用Java中的Response对象实现跳转 使用Java中的RequestDispatcher对象实现跳转 2. 使用超链接跳转 超链接跳转是最常用的方法之一,在HTM…

    Java 2023年6月15日
    00
  • SpringBoot实现简单的登录注册的项目实战

    Spring Boot 实现简单的登录注册的项目实战 在本文中,我们将介绍如何使用 Spring Boot 实现简单的登录注册功能。我们将使用 Thymeleaf 模板引擎和 Spring Security 安全框架来实现这个项目。 项目需求 我们将实现一个简单的登录注册功能,具体需求如下: 用户可以注册一个新账户。 用户可以使用已注册的账户登录。 登录成功…

    Java 2023年5月15日
    00
  • Java中的线程是什么?

    Java中的线程是程序执行的最小单位。线程是指在单个程序中执行的一组指令,这些指令共享同一个进程,并且可以访问相同的变量和对象。在Java中,线程是通过Thread类来实现的。 创建线程的方式 在Java中,创建线程有两种方式: 继承Thread类 通过继承Thread类并重写run方法来创建线程。示例代码如下: class MyThread extends…

    Java 2023年4月28日
    00
  • spring-cloud-gateway启动踩坑及解决

    下面是关于“spring-cloud-gateway启动踩坑及解决”的完整攻略: Spring Cloud Gateway启动踩坑及解决 问题描述 在使用Spring Cloud Gateway时,有时会遇到启动失败的情况,主要是因为配置问题。如下: Caused by: java.lang.IllegalArgumentException: No inst…

    Java 2023年5月27日
    00
  • Java Spring Boot消息服务万字详解分析

    Java SpringBoot消息服务万字详解分析 在Java SpringBoot中,我们可以使用消息服务来实现异步通信和解耦。本文将详细讲解Java SpringBoot消息服务的完整攻略,并提供两个示例。 1. 消息服务概述 消息服务是一种异步通信机制,它可以将消息发送到消息队列中,然后由消费者从队列中获取消息并进行处理。消息服务可以实现系统之间的解耦…

    Java 2023年5月15日
    00
  • Java实现从jar包中读取指定文件的方法

    当我们需要从Java的一个jar包中读取指定的文件时,可以采用以下的几种方法,下面将针对每种方法进行详细讲解。 方法一:使用ClassLoader.getResourceAsStream()方法 该方法可以从一个jar包中直接读取文件的输入流,可以通过下面的步骤来实现: 确定需要读取的文件名,如 config.properties。 获取到当前线程的Clas…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部