Java 并发编程学习笔记(3) ----Semaphore-tryAcquire()的使用

2024-04-20 17:38

本文主要是介绍Java 并发编程学习笔记(3) ----Semaphore-tryAcquire()的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

tryAcquire()的使用

参数使用

当前时刻tryAcquire(int permits)Acquires the given number of permits from this semaphore, only if all are available at the time of invocation.尝试去从这个信号量获取指定数量的在调用时都是可用的许可 。如果不使用permits 参数,tryAcquire()表示获取一个许可。指定时间tryAcquire(int permits, long timeout, TimeUnit unit)Acquires the given number of permits from this semaphore,if all become available within the given waiting time and the current thread has not been interrupted.在指定的时间内尝试去从这个信号量获取指定数量的许可 ,同时这段时间内,这个线程没有被中断。如果不使用permits 参数,tryAcquire(long timeout, TimeUnit unit)表示获取一个许可。  

代码


package com.lhc.concurrent.semaphore;import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;public class TryAcquireService {private Semaphore semaphore = new Semaphore(8);public void doSomething() {try {/*** tryAcquire(int permits)* Acquires the given number of permits from this semaphore, only if all are available at the time of invocation.* 尝试去从这个信号量获取指定数量的在调用时都是可用的许可 。* 如果不使用permits 参数,tryAcquire()表示获取一个许可。*/if (semaphore.tryAcquire(2)) {System.out.println(Thread.currentThread().getName() + "获得锁,时间:" + System.currentTimeMillis());Thread.sleep(100);semaphore.release(2);}else {System.out.println(Thread.currentThread().getName() + "没有获得锁,时间:" + System.currentTimeMillis());}}catch (InterruptedException e){e.printStackTrace();}}public void doThing() {try {/*** tryAcquire(int permits, long timeout, TimeUnit unit)* Acquires the given number of permits from this semaphore,* if all become available within the given waiting time and the current thread has not been interrupted.* 在指定的时间内尝试去从这个信号量获取指定数量的许可 ,同时这段时间内,这个线程没有被中断。* 如果不使用permits 参数,tryAcquire(long timeout, TimeUnit unit)表示获取一个许可。*/if (semaphore.tryAcquire(2, 1, TimeUnit.SECONDS)) {System.out.println(Thread.currentThread().getName() + "获得锁,时间:" + System.currentTimeMillis());Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + "释放锁,时间:" + System.currentTimeMillis());semaphore.release(2);}else {System.out.println(Thread.currentThread().getName() + "没有获得锁,时间:" + System.currentTimeMillis());}}catch (InterruptedException e){e.printStackTrace();}}
}

测试类


package com.lhc.concurrent.semaphore;public class TryAcquireThread extends Thread{private TryAcquireService tryAcquireService;public TryAcquireThread(TryAcquireService tryAcquireService, String name) {super();this.tryAcquireService = tryAcquireService;this.setName(name);}public static void main(String[] args){TryAcquireService tryAcquireService = new TryAcquireService();for (int i = 0; i < 10; i++) {TryAcquireThread tryAcquireThread = new TryAcquireThread(tryAcquireService, "线程" + i);tryAcquireThread.start();}}@Overridepublic void run() {//tryAcquireService.doSomething();tryAcquireService.doThing();}
}

测试结果

获取当前时刻

线程0获得锁,时间:1555145916044
线程4没有获得锁,时间:1555145916044
线程2获得锁,时间:1555145916044
线程1获得锁,时间:1555145916044
线程6没有获得锁,时间:1555145916044
线程5没有获得锁,时间:1555145916044
线程3获得锁,时间:1555145916044
线程7没有获得锁,时间:1555145916044
线程8没有获得锁,时间:1555145916044
线程9没有获得锁,时间:1555145916044

获取指定时间内

线程9获得锁,时间:1555146046722
线程7获得锁,时间:1555146046722
线程1获得锁,时间:1555146046722
线程6获得锁,时间:1555146046722
线程6释放锁,时间:1555146047722
线程9释放锁,时间:1555146047722
线程5获得锁,时间:1555146047722
线程4获得锁,时间:1555146047722
线程3没有获得锁,时间:1555146047722
线程1释放锁,时间:1555146047722
线程7释放锁,时间:1555146047722
线程0没有获得锁,时间:1555146047722
线程8没有获得锁,时间:1555146047722
线程2没有获得锁,时间:1555146047722
线程5释放锁,时间:1555146048723
线程4释放锁,时间:1555146048723

这篇关于Java 并发编程学习笔记(3) ----Semaphore-tryAcquire()的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920914

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python