Semaphore
信号量可以控制线程的并发数量
通常用于那些资源有明确访问数量限制的场景,常用于限流 。
使用 Semaphore
先调用acquire()
获取,然后通过try ... finally
保证在finally
中释放。
Semaphore常用方法说明
-
acquire()
获取一个令牌,在获取到令牌、或者被其他线程调用中断之前线程一直处于阻塞状态。 -
acquire(int permits)
获取一个令牌,在获取到令牌、或者被其他线程调用中断、或超时之前线程一直处于阻塞状态。 -
acquireUninterruptibly()
获取一个令牌,在获取到令牌之前线程一直处于阻塞状态(忽略中断)。 -
tryAcquire()
尝试获得令牌,返回获取令牌成功或失败,不阻塞线程。 -
tryAcquire(long timeout, TimeUnit unit)
尝试获得令牌,在超时时间内循环尝试获取,直到尝试获取成功或超时返回,不阻塞线程。
-
release()
释放一个令牌,唤醒一个获取令牌不成功的阻塞线程。文章来源:https://www.toymoban.com/news/detail-523942.html
面试常考题目交替打印ABC
@Test
public void testSemaphore() {
int i1 = 100;
Semaphore semaphore1 = new Semaphore(1, true);
Semaphore semaphore2 = new Semaphore(0);
Semaphore semaphore3 = new Semaphore(0);
new Thread(() -> {
try {
for (int i = 0; i < i1; i++) {
semaphore1.acquire();
System.out.print("A");
semaphore2.release();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
for (int i = 0; i < i1; i++) {
semaphore2.acquire();
System.out.print("B");
semaphore3.release(1);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
for (int i = 0; i < i1; i++) {
semaphore3.acquire();
System.out.println("C");
semaphore1.release(1);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
Semaphore 使用及原理
文章来源地址https://www.toymoban.com/news/detail-523942.html
到了这里,关于Java并发编程:Semaphore的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!