Semaphore和Exchanger的使用

本文详细介绍了Semaphore的构造方法、各类方法的使用及其作用,包括许可数量的控制、线程同步等;同时还介绍了Exchanger的基本使用,特别是exchange()方法的阻塞性质,帮助读者更好地理解这两个并发工具类。

一、semaphore的使用

1.类semaphore的同步性

        多线程中的同步概念其实就是排着队去执行一个任务,执行任务是一个一个执行,并不能并行执行,这样的优点是有助于程序逻辑的正确性,不会出现非线程安全问题,保证软件系统功能上的运行稳定性。

        类semaphore的构造函数参数permits是许可的意思,代表同一时间内,最多允许多少个线程同时acquire()和release()之间的代码。

         无参方法acquire()的作用是使用1个许可,是减法操作。

2.类semaphore构造方法permits参数的作用

private Semaphore semaphore = new Semaphore(1);

使同一时间内最多只有1个线程可以执行acquire()和release()之间的代码,因为只有一个许可。

  new Semaphore(2);含义是同一时间内最多允许2个线程执行acquire()和release()之间的代码。

3.方法acquire(int permits)参数作用及动态添加permits许可数量

        有参方法acquire(int permits)的功能是每调用1次此方法,就使用X个许可。

 4.方法acquireUninterruptibly的使用

         方法acquireUninterruptibly()的作用是使等待进入acquire()方法的线程,不允许被中断。

 

 5.方法availablePermits()和drainPermits()

        availablePermits()返回此semaphore对象中当前可用的许可数,此方法通常用于调试,因为许可的数量有可能时时在变化,并不是固定的数量。

        drainPermits()可获取并返回立即可用的所有的许可个数,并将可用许可置0.

6.方法getQueueLength()和hasQueuedThreads()

        getQueueLength()的作用是获取等待许可的线程个数。

        hasQueuedThreads()的作用是判断有没有线程在等待这个许可。

7.方法tryAcquire()的使用

        该方法尝试地获取1个许可,如果获取不到则返回false,此方法通常与if语句结合使用,其具有无阻塞的特点。

8.方法tryAcquire(int permits)的使用

        该方法的作用是尝试的获取X个许可,如果获取不到则返回false。

9.方法tryAcquire(long timeout, TimeUnit unit)的使用

        该方法的作用是在指定的时间内尝试地获取1个许可,如果获取不到则返回false。

10.方法tryAcquire(int permits, long timeout, TimeUnit unit)的使用

        在指定时间内尝试地获取X个许可,如果获取不到则返回false。

二、Exchanger的使用

        类exchange的功能可以使2个线程之间传输数据,它比生产者/消费者模型使用的wait和notify更加方便。

1.方法exchange()阻塞的特性

        类Exchanger中的exchange()方法具有阻塞的特色,也就是此方法被调用后等待其他线程来获取数据,如果没有其他线程取得数据,则一直等待。

 

 2.方法exchange()传递数据

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值