博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程同步工具 Semaphore类的基础使用
阅读量:4670 次
发布时间:2019-06-09

本文共 2013 字,大约阅读时间需要 6 分钟。

推荐好文:

简介

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

转载于:https://www.cnblogs.com/boothsun/p/7141272.html

你可能感兴趣的文章
java-字符串反转
查看>>
获取一个目录下的所有文件
查看>>
微软发布Sample Browser for Windows 8版:5000示例代码,"触手可及"
查看>>
Windows 10 使用问题
查看>>
linux xargs命令
查看>>
用CSS3实现图像风格
查看>>
转载--黎曼
查看>>
mysql的建表语句
查看>>
免费的HTML5版uploadify
查看>>
机器学习之路:python 集成分类器 随机森林分类RandomForestClassifier 梯度提升决策树分类GradientBoostingClassifier 预测泰坦尼克号幸存者...
查看>>
通过onkeydown事件来控制只允许数字
查看>>
Python实现常用的数据结构
查看>>
snort简介以及在Ubuntu下的安装
查看>>
从SVN资源库下载项目
查看>>
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
查看>>
php克隆 自动加载
查看>>
删除同目录下面txt文件(利用os,fnmacth模块)
查看>>
sqlserver 按日、周、月统计方法
查看>>
简单几步让CentOS系统时间同步
查看>>
Host aggregate分区
查看>>