首页 > 其他分享 >Semaphore简单使用

Semaphore简单使用

时间:2022-12-22 20:12:07浏览次数:36  
标签:java Thread 简单 使用 semaphore Semaphore public 资源

Semaphore可以限制单个时间内允许活跃的线程数
//同一时间段允许3个线程活跃,非公平的模式
Semaphore semaphore = new Semaphore(3,false);

  

//这里表示拿到一份资源,剩下只有2份资源可用了
semaphore.acquire();

 

 //这里表示释放一份资源,就又恢复成还有3份资源可用
semaphore.release();

 效果图

 

 图中显示同一个时间内只有三份资源可用

代码部分

package com.java.test.semaphores;

import lombok.extern.slf4j.Slf4j;

import java.util.Random;
import java.util.concurrent.Semaphore;

/**
 * @Description:
 * @Author: Yourheart
 * @Create: 2022/12/22 10:13
 */
@Slf4j
public class SemaphoreThread extends Thread {

    private final Semaphore semaphore;
    private final Random random = new Random();

    public SemaphoreThread(String name, Semaphore semaphore) {
        super(name);
        this.semaphore = semaphore;
    }

    @Override
    public void run() {

        try {
            //这里表示拿到一份资源,剩下只有2份资源可用了
            semaphore.acquire();
            log.info(Thread.currentThread().getName() + " - 抢座成 功,开始写作业");
            Thread.sleep(random.nextInt(1000));
            log.info(Thread.currentThread().getName() + " - 作业完 成,腾出座位");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //这里表示释放一份资源,就又恢复成还有3份资源可用
        semaphore.release();

    }
}

  

package com.java.test.semaphores;

import java.util.concurrent.Semaphore;

/**
 * @author yourheart
 * @Description
 * @create 2022-12-21 23:02
 */
public class SemaphoreDemo {

    public static void main(String[] args) {
        //同一时间段允许3个线程活跃,非公平的模式
        Semaphore semaphore = new Semaphore(3,false);
        for (int i = 0; i < 20; i++) {
            new SemaphoreThread("学生-" + (i + 1), semaphore).start();
        }
    }
}

  

标签:java,Thread,简单,使用,semaphore,Semaphore,public,资源
From: https://www.cnblogs.com/q202105271618/p/16997927.html

相关文章

  • CountDownLatch简单使用
    如何保证主线程在副线程执行结束后才会执行结束,这里使用CountDownLatch    //设置三个线程需要执行CountDownLatchlatch=newCountDownLatch(3);......
  • Springboot+Mybatis+MySql下,mysql使用json类型字段存取的处理
    转载:Springboot+Mybatis+MySql下,mysql使用json类型字段存取的处理背景:1、mysql5.7开始支持json类型字段;2、mybatis暂不支持json类型字段的处理,需要自己做处理项目......
  • jmeter的函数使用
    JMeter提供了很多函数,如果能够熟练使用,可以为脚本带来很多方便。JMeter函数是一种特殊值,可用于除测试计划外的任何组件。函数调用的格式如下所示:${__functionName(var1,var2......
  • 开源库glog使用
    windows下:1,下载地址: https://github.com/google/glog点击DownloadZIP下载即可。2.解压,打开google-glog.sln编译,生成debug下的lib和dll文件;3.将新建一个基于console......
  • Linux 初级班(A) – 2. Linux简单目录结构
    Linux 标准目录结构如下:1. 目录架构根目录:  /· root --- 启动​​Linux​​​时使用的一些核心文件。如操作系统​​内核​​​、引导程序​​Grub​​等。· hom......
  • Linux 初级班(A) – 1. Linux图形界面使用
    Linux图形界面和Windows差不了多少,大同小异。由于习惯性的问题,我们可能觉得Linux的界面不是特别友好,其实Linux是很友好的,他高效且可以定制化。安装后参见帮助文档半天就可以......
  • Maven -- 属性的定义和使用(可以理解为Maven的变量)
    属性的定义和使用版本统一的重要性   如果定义了多个资源不同版本的依赖,会以后面配置的为准,那么我们怎么实现资源版本的统一呢?可以用属性解决,相当于Java语言中......
  • [leetcode]第 6 天 搜索与回溯算法(简单)
    32-I.从上到下打印二叉树思路没有思路。。看题解要求二叉树从上至下打印,叫做二叉树的广度优先搜索(BFS)。BFS通常借助队列的先入先出特性实现。算法流程:1.特例处理......
  • 一款功能强大的浏览器网页视频下载插件-猫爪视频下载插件使用与安装
    猫爪视频下载插件官方版是一款功能强大的浏览器插件工具。通过猫爪视频下载插件用户可以轻松的抓取任意网页的视频文件,并将其保存到本地,节省了缓存加载的时间。猫爪视频......
  • vue3使用composables来取代mixins 来状态复用
    前言最简单理解composables的方式就是将其视为vue版的自定义hooks来个demo比如页面初始化的时候我需要请求接口获取数据并回填至表单以前的做法src/pages/index.......