「这是我参与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();
}
}
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。