Java多线程Semaphore工具的使用详解
短信预约 -IT技能 免费直播动态提醒
Semaphore 是一种用于控制线程并发访问数的同步工具。它通过维护一定数量的许可证来限制对共享资源的访问。 许可证的数量就是可以同时访问共享资源的线程数目。
当一个线程需要访问共享资源时,它必须先获取一个许可证,如果没有许可证可用,线程就会被阻塞,直到有一个许可证可用。 当一个线程完成了对共享资源的访问后,它必须释放一个许可证,以便其他线程可以获取许可证继续访问共享资源。
虽然 Semaphore 主要用于限制并发访问数,但是在实际应用中,Semaphore 还可以用于线程之间的协作,比如实现线程的顺序执行、线程间的消息传递等等。 所以,Semaphore 并不仅仅是限制并发数,它还可以用于实现更多的线程协作场景。
import java.util.concurrent.Semaphore;
public class SemaphoreDemo {
public static void main(String[] args) {
//availablePermits(semaphore);
tryAcquire();
}
private static void tryAcquire() {
// 创建一个 Semaphore 对象,初始化许可证数量为 1
Semaphore semaphore = new Semaphore(1);
// 获取一个许可证,获取成功
boolean success1 = semaphore.tryAcquire();
System.out.println("success1: " + success1); // 输出 true
// 再次获取一个许可证,获取失败
boolean success2 = semaphore.tryAcquire();
System.out.println("success2: " + success2); // 输出 false
// 释放一个许可证
semaphore.release();
// 再次获取一个许可证,获取成功
boolean success3 = semaphore.tryAcquire();
System.out.println("success3: " + success3); // 输出 true
}
private static void availablePermits() {
// 创建一个 Semaphore 对象,初始化许可证数量为 3
Semaphore semaphore = new Semaphore(3);
System.out.println("available permits: " + semaphore.availablePermits()); // 输出 3
// 获取一个许可证
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("worker 1 is working...");
System.out.println("available permits: " + semaphore.availablePermits()); // 输出 2
// 释放一个许可证
semaphore.release();
System.out.println("worker 1 has finished his work.");
System.out.println("available permits: " + semaphore.availablePermits()); // 输出 3
}
}
package com.lfsun.highconcurrency000.juc.semaphore;
import java.util.concurrent.Semaphore;
public class MySemaphoreDemo {
public static void main(String[] args) {
// 创建一个 Semaphore 对象,初始化许可证数量为 3
Semaphore semaphore = new Semaphore(3);
// 创建 5 个线程并启动
for (int i = 1; i <= 5; i++) {
new Thread(new Worker(i, semaphore)).start();
}
}
}
class Worker implements Runnable {
private int id;
private Semaphore semaphore;
public Worker(int id, Semaphore semaphore) {
this.id = id;
this.semaphore = semaphore;
}
@Override
public void run() {
try {
// 获取一个许可证
semaphore.acquire();
System.out.println("worker " + id + " is working...");
// 模拟工作过程
Thread.sleep((long) (Math.random() * 5000));
// 释放一个许可证
semaphore.release();
System.out.println("worker " + id + " has finished his work.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
到此这篇关于Java多线程Semaphore工具的使用详解的文章就介绍到这了,更多相关Java多线程Semaphore内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341