Semaphore的使用之方法tryAcquire()的使用

来源:互联网 发布:excel怎么求数据的方差 编辑:程序博客网 时间:2024/06/06 00:53

无参方法tryAcquire()的作用是尝试的获得1个许可,如果获取不到则返回false,该方法通常与if语句结合使用,其具有无阻塞的特点。无阻塞的特点可以使线程不至于在同步处一直持续等待的状态,如果if语句判断不成立则线程会继续走slse语句,程序会继续向下运行。

创建Java项目Semaphore_tryAcquire,MyService.java代码如下:

package com.yc.semephore_3;import java.util.concurrent.Semaphore;public class MyService {private Semaphore semaphore = new Semaphore(1);@SuppressWarnings("unused")public void testFair(){if(semaphore.tryAcquire()){System.out.println( Thread.currentThread().getName() + "首先进入");//做一些耗时操作for(int i = 0; i < Integer.MAX_VALUE ; i ++){String newString = new String();}semaphore.release();}else{System.out.println(Thread.currentThread().getName() + "没有得到许可");}}}
创建ThreadA和ThreadB如下:
package com.yc.semephore_3;public class ThreadA extends Thread{private MyService service;public ThreadA(MyService service){super();this.service = service;}@Overridepublic void run() {service.testFair();}}

package com.yc.semephore_3;public class ThreadB extends Thread{private MyService service;public ThreadB(MyService service){super();this.service = service;}@Overridepublic void run() {service.testFair();}}
创建SemaphoreTryAcquireTest.java如下:

package com.yc.semephore_3;public class SemaphoreTryAcquireTest {public static void main(String[] args) {MyService service = new MyService();ThreadA a = new ThreadA(service);a.setName("A");ThreadB b = new ThreadB(service);b.setName("B");a.start();b.start();}}

测试结果如下:

A首先进入B没有得到许可

若把Semaphore的初始化permits参数改成2,测试结果如下:
B首先进入A首先进入

这也正符合前面的两个许可两个线程竞争。


有参方法tryAcquire(permits)的作用是尝试获取x个许可,如果获取不到则返回false,把上面的Service.java修改如下:
package com.yc.semephore_3;import java.util.concurrent.Semaphore;public class MyService {private Semaphore semaphore = new Semaphore(3);@SuppressWarnings("unused")public void testFair(){if(semaphore.tryAcquire(3)){System.out.println( Thread.currentThread().getName() + "首先进入");//做一些耗时操作for(int i = 0; i < Integer.MAX_VALUE ; i ++){String newString = new String();}semaphore.release();}else{System.out.println(Thread.currentThread().getName() + "没有得到许可");}}}

得到如下测试结果:

A首先进入B没有得到许可

倘若把
private Semaphore semaphore = new Semaphore(3);
改成
private Semaphore semaphore = new Semaphore(2);
测试结果如下:
A没有得到许可B没有得到许可

说明2个不够。



有参方法tryAcquire(long timeout, TimeUnit unit)的作用是在指定的时间内尝试地获取1个许可,如果获取不到就返回false。

将Service.java修改如下:

package com.yc.semephore_3;import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;public class MyService {private Semaphore semaphore = new Semaphore(1);@SuppressWarnings("unused")public void testFair(){try {if(semaphore.tryAcquire(3, TimeUnit.SECONDS)){System.out.println( Thread.currentThread().getName() + "首先进入");//做一些耗时操作for(int i = 0; i < Integer.MAX_VALUE ; i ++){String newString = new String();}semaphore.release();}else{System.out.println(Thread.currentThread().getName() + "没有得到许可");}} catch (InterruptedException e) {e.printStackTrace();}}}
3 秒后测试结果如下:

A首先进入B没有得到许可

倘若将程序里面的耗时操作改成低于三秒后,我把条件改成 i  <   Integer.MIN_VALUE 测试的结果为:
A首先进入B首先进入

与上面的结果对比知道当线程A进入if后用掉1个许可,耗时操作后,release许可,此时耗时并未超过3秒,所以线程B也获得了许可。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑开机后显示英文字该怎么办? 看到文言文就不会翻译该怎么办呢 房间楼层太高闷热不通风怎么办 对方全责不理赔没有财产怎么办啊 买二手房过户后发现房顶漏水怎么办 钻石绣的钻两个粘在一起怎么办 开修理部的一天不干活都着急怎么办 调好的车漆时间长了有点稠怎么办 下滤鱼缸下水管声音大怎么办 家里水管不开水龙头就总是响怎么办 生完儿子后腹股沟特黑怎么办 因盗窃罪出狱数额较大还不起怎么办 司法拍卖房原房主拒绝搬离怎么办 wps卡了没反应没有保存怎么办 微信扫描支付环境有风险怎么办 手机安装东西突然要扫描很久怎么办 我惹朋友真的很生气了怎么办 买了保险后又犯杀人罪 保险怎么办 水瓶盖了拧歪了打不开怎么办 刚买的老干妈盖子打不开怎么办? 门冬胰岛素的盖子转不动怎么办 diy做的蝴蝶结上的歪了怎么办 电脑显示电源已接通未充电怎么办 微博账号被锁无法登录怎么办 惠头条登录过两个账号被锁了怎么办 被两个月大的小狗咬破皮了怎么办 阿根廷认证出口声明成分错了怎么办 花盆土里面有白色的虫子怎么办 刚买的月季苗叶子黄了怎么办? 月季新出的芽中间黑了怎么办 龙须的茎被折断了怎么办? 扦插的月季跟部总发黑怎么办 用过皮炎平后的黑印怎么办 兰花现在不管王莽岭了员工怎么办 家里很穷妈妈还不知道省钱怎么办 执业医师电子注册信息弄错了怎么办 开过花后的百合花根怎么办 荔枝吃起来有股保鲜剂的味道怎么办 厂停产不宣布倒闭又不赔钱怎么办 二审判决生效后发现判错了怎么办 应收账款质押后附属的担保怎么办