博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发编程-信号量
阅读量:6983 次
发布时间:2019-06-27

本文共 1725 字,大约阅读时间需要 5 分钟。

Semaphore 直译是信号量,它的功能比较好理解,就是通过构造函数设定一个数量的许可,然后通过 acquire 方法获得许可,release 方法释放许可。它还有 tryAcquire 和 acquireUninterruptibly 方法,可以根据自己的需要选择。

以下是模拟一个连接池,控制同一时间最多只能有50个线程访问,主线程每毫秒创建一个子线程,连接池50个许可,每个获取连接的子线程持球300ms,连接等待超时500ms。

import java.util.UUID;import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;public class TestSemaphore extends Thread {
public static void main(String[] args) {
int i = 0; while (i < 500) {
i++; new TestSemaphore().start(); try {
Thread.sleep(1); } catch (InterruptedException e) {
e.printStackTrace(); } } } /** * 控制某资源同时被访问的个数的类 控制同一时间最后只能有50个访问 */ static Semaphore semaphore = new Semaphore(50); static int timeout = 500; public void run() {
try {
Object connec = getConnection(); System.out.println("获得一个连接" + connec); Thread.sleep(300); releaseConnection(connec); } catch (InterruptedException e) {
e.printStackTrace(); } } public void releaseConnection(Object connec) {
/* 释放许可 */ semaphore.release(); System.out.println("释放一个连接" + connec); } public Object getConnection() {
try {
/* 获取许可 */ boolean getAccquire = semaphore.tryAcquire(timeout, TimeUnit.MILLISECONDS); if (getAccquire) {
return UUID.randomUUID().toString(); } } catch (InterruptedException e) {
e.printStackTrace(); } throw new IllegalArgumentException("timeout"); }}

转载于:https://www.cnblogs.com/suxuan/p/4948755.html

你可能感兴趣的文章
lintcode 中等题:A + B Problem A + B 问题
查看>>
一亩三分地帖子
查看>>
MySql绿色版安装过程记录
查看>>
Struts2文件上传的大小限制问题
查看>>
maven web项目build失败
查看>>
jQuery-1.9.1源码分析系列(六) 延时对象应用——jQuery.ready
查看>>
关于Kingfisher--备用
查看>>
段错误调试神器 - Core Dump详解
查看>>
审计参数 audit_trail
查看>>
linux shell的输出效果修改方法(界面颜色)
查看>>
《TCP/IP具体解释》读书笔记(18章)-TCP连接的建立与中止
查看>>
Matlab Command Window 进度提示
查看>>
利用redis写webshell
查看>>
IO 延迟与Queue Depth
查看>>
IOS 设备信息读取
查看>>
不可重复读和幻读的区别
查看>>
LeetCode_Path Sum II
查看>>
CF 439C(251C题)Devu and Partitioning of the Array
查看>>
更新整理本人全部博文中提供的代码与工具(Java,2014.09)
查看>>
常见的显示器分辨率
查看>>