2022更文挑战27-java并发关键字:semaphore

126 阅读2分钟

「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」。

java并发关键字:semaphore

前文

本文内容为对于java并发关键字semaphore的一些知识总结及理解,文章中不免会存在不准确之处,还请见谅。

semaphore关键字

semaphore这个单词字面上含义为信号标,在这里我们一般称之为信号量。这个关键字含义,大概上来说是用来控制线程同时执行的并发量,从而达到对于资源同时访问的控制。信号量维护着一组许可证,当线程需要执行时,首先需要申请信号量。当信号量无法申请到时则无法执行,申请到信号量则会继续执行后续逻辑。而当线程执行完毕时需要释放信号量,这样后续的线程才可以获取信号量并执行。

而在使用过程中,首先需要进行信号量初始化,初始化阶段要传入信号量数值,该数值确定了同时有多少个线程同时执行。而在线程开始执行前,需要获取信号量,调用acquire方法。而在线程执行结束时,需要调用release方法,对信号量进行释放,以便其他线程能够获取到信号量执行。另外,如果想知道目前是否有空闲信号量,可以调用tryAcquire方法,获取当前信号量数目是否大于1,返回值为布尔类型。

下面来简单看一下使用的代码。有10个线程,而信号量设置为5,线程执行时需要消耗5秒的时间。执行结果显示大概每5个线程为1组同时执行,其他的线程由于获取不到信号量,只有等待线程执行结束释放信号量才能够执行。

public static void main(String[] args) {
    Semaphore semaphore = new Semaphore(5);
    for (int i = 0; i < 10; i++) {
        int finalI = i;
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    semaphore.acquire();
                    System.out.println("线程" + String.valueOf(finalI) + "开始执行");
                    Thread.sleep(5000);
                    System.out.println("线程" + String.valueOf(finalI) + "开始结束");
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }
}

image.png

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。