多线程-并发包-Semaphore(信号量)

多线程-并发包-Semaphore(信号量)

Semaphore 是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore 可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建技术为 1 的 Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。

规定了只能同时又多少个线程在执行,如果超出规定的线程数量,会进行等待。
等已经在处理的线程处理完,释放资源后,处于等待的线程才会继续执行后续的逻辑。

它的用法如下:

// 设置最多只能有三个线程并发执行,该对象通过构造方法形参的形式传入线程中
Semaphore semaphore = new Semaphore(3);
// 获取当前剩余的资源数量
int  semaphore.availablePerits() 	
// 申请资源,每次调用一次减一,如果没有了就等待。
semaphore.acpuire();						
// 处理完之后,释放资源。
semaphore.release();						

代码示例:

package com.test.thread.concurrent.count.semaphore;

import java.util.concurrent.Semaphore;

/**
 * 规定了只能同时又多少个线程在执行,如果超出规定的线程数量,会进行等待。
 * 等已经在处理的线程处理完,释放资源后,处于等待的线程才会继续执行后续的逻辑。
 */
class Parent extends Thread{
    private Semaphore semaphore;
    String name;
    public Parent(Semaphore semaphore, String name){
        this.semaphore = semaphore;
        this.name = name;
    }

    @Override
    public void run(){
        // 获取到资源,减去 1
        int availablePermits = semaphore.availablePermits();
        if (availablePermits > 0){
            System.out.println(name + " 抢到资源");
        }else {
            System.out.println(name + " 没有资源了");
        }
        try{
            // 每次调用一次减一,如果没有了就等待。
            semaphore.acquire();
            System.out.println(name + "终于可以开始处理数据啦。。。");
            Thread.sleep(1000);// 模拟处理数据消耗的时间
            System.out.println(name + "数据处理完毕。。。");
        }catch (Exception e){

        }finally {
            // 释放资源
            semaphore.release();
        }
    }
}

public class SemaphoreDemo {

    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3);
        for (int i = 1; i <= 10; i++) {
            new Parent(semaphore, "第"+i+"个人").start();
        }
    }
}

代码运行结果:

1个人 抢到资源
第2个人 抢到资源
第3个人 抢到资源
第3个人终于可以开始处理数据啦。。。
第1个人终于可以开始处理数据啦。。。
第2个人终于可以开始处理数据啦。。。
第5个人 没有资源了
第7个人 没有资源了
第9个人 没有资源了
第4个人 没有资源了
第8个人 没有资源了
第6个人 没有资源了
第10个人 没有资源了
第3个人数据处理完毕。。。
第5个人终于可以开始处理数据啦。。。
第1个人数据处理完毕。。。
第7个人终于可以开始处理数据啦。。。
第2个人数据处理完毕。。。
第9个人终于可以开始处理数据啦。。。
第7个人数据处理完毕。。。
第5个人数据处理完毕。。。
第4个人终于可以开始处理数据啦。。。
第8个人终于可以开始处理数据啦。。。
第9个人数据处理完毕。。。
第6个人终于可以开始处理数据啦。。。
第4个人数据处理完毕。。。
第10个人终于可以开始处理数据啦。。。
第8个人数据处理完毕。。。
第6个人数据处理完毕。。。
第10个人数据处理完毕。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值