zoukankan      html  css  js  c++  java
  • 线程同步工具 Semaphore类的基础使用

    推荐好文:

    1. 线程同步工具(一)
    2. 线程同步工具(二)控制并发访问多个资源
    3. 并发工具类(三)控制并发线程数的Semaphore

    简介

    Semaphore是基于计数的信号量,可以用来控制同时访问特定资源的线程数量;可以通过设定一个阈值,基于此,多个线程争抢获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞,直到有其他线程释放许可信号。

    Semaphore可以用来构建一些线程池,资源池之类的,比如数据库连接池,我们也可以创建计数为1的Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。

    很多年以来, 我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆在这条路上行驶,其他的都必须在路口等待,所以前一百辆会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XXX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表示线程在执行,离开马路就表示线程执行完成,看见红灯就表示线程被阻塞,不能执行。

    个人理解: Semaphores就是一个控制访问共享资源的计数器。

    常用API

    在线手册地址

    1. 构造方法: 
    Semaphore(int permits)  用给定的允许数量和默认的非公平设置创建Semaphore对象。
    Semaphore(int permits , boolean fair) 用给定的允许数量和给定的公平设置创建一个Semaphore对象。
    
    2. 常用方法
    1) void acquire()
    从信号量里获取一个可用的许可,如果没有可用的许可,那么当前线程将被禁用以进行线程调度,并且处于休眠状态。
    
    2) void release() 
    释放一个许可,将其返回给信号量
    
    3) int availablePermits()
    返回此信号量中当前可用的许可数量。
    
    4) boolean hasQueuedThreads()
    查询是否有线程正在等待获取。
    

    使用案例

    
    import java.util.concurrent.Semaphore;
    
    public class SemaphoreTest {
    
        public static void main(String[] args) {
            Service service = new Service() ;
        
            ThreadRun a = new ThreadRun(service) ;
            a.setName("A");
        
            ThreadRun b = new ThreadRun(service);
            b.setName("b");
        
            ThreadRun c = new ThreadRun(service) ;
            c.setName("C");
        
            a.start();
            b.start();
            c.start();
        
        }
    }
    
    
    class Service {
        private Semaphore semaphore = new Semaphore(2);
    
        public void testMethod() {
            try {
                semaphore.acquire();
                System.out.println(Thread.currentThread().getName() + " begin timer=" + System.currentTimeMillis());
                Thread.sleep(5000);
                System.out.println(Thread.currentThread().getName() + " end timer=" + System.currentTimeMillis());
                semaphore.release();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    class ThreadRun extends Thread {
    
        Service service ;
        public ThreadRun (Service service) {
            this.service = service ;
        }
    
        @Override
        public void run() {
            service.testMethod();
        }
    }
    
  • 相关阅读:
    UnityVS(Visual Studio Tools For Unity)的安装与使用
    Balsamiq Mockups注册码
    python基础之os.system函数
    jenkins配置记录(1)--添加用户权限
    chromedriver与chrome各版本及下载地址
    高阶面试官应掌握哪些面试技巧
    [面试技巧]16个经典面试问题回答思路
    自动代码质量分析(GitLab+JenKins+SonarQube)
    Git提交代码自动触发JenKins构建项目
    Allure 安装及使用
  • 原文地址:https://www.cnblogs.com/boothsun/p/7141272.html
Copyright © 2011-2022 走看看