美文网首页
多线程相关之------Semaphore(信号量)

多线程相关之------Semaphore(信号量)

作者: 早点起床晒太阳 | 来源:发表于2020-10-05 16:45 被阅读0次

参考资料:
https://juejin.im/post/6844903537508368398 (对于简单应用介绍包括简单代码)

最近在写多线程拷贝的时候使用到了Semaphore,这里简单记录下

基础使用

信号量用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。
信号量Semaphore管理者一组许可,这个可以通过构造函数来初始化。然后通过方法

acquire()

来获取许可,如果没有了许可,会被阻塞。//Acquires a permit from this semaphore, blocking until one is available

然后通过

release()

来释放一个许可,返回给Semaphore。

项目应用

我们在写多线程IO流拷贝的时候,对于目录的拷贝使用到了递归。所以没办法确定有多少个任务,以及什么时候执行完成。最终使用到了信号量。
让它在每个任务前获取许可,任务完成结束许可,因为acquire() 也会有阻塞作用

最后使用while(true) 去获取信号量初始化的总数使用方法

public boolean tryAcquire(int permits, long timeout, TimeUnit unit)

是否都在来决定是否所有的任务都以完成,伪代码如下

while (true) {
    try {
        boolean acquired = semaphore.tryAcquire(permits, 3, TimeUnit.SECONDS);
        Exception e = ex.get();
        if (e != null) {
            throw e;
        }
        if (acquired) break;
    } catch (Exception e) {
        throw e;
    }
}

然后我突然想到一个问题,就是我在tryAcquire(int permits, long timeout, TimeUnit unit) 的时候,有线程在调用acquire()的时候的优先级的问题,因为如果tryAcquire 优先的话那这样程序就会有问题。然后我找tryAcquire这个方法的注释的说明看到了这么一段话

Any permits that were to be assigned to this thread, are instead
assigned to other threads trying to acquire permits, as if
the permits had been made available by a call to {@link #release()}.

说明在 tryAcquire(int permits, long timeout, TimeUnit unit) 这个方法中
所以肯定会等待所有acquire 的线程执行完后,才会执行

相关文章

网友评论

      本文标题:多线程相关之------Semaphore(信号量)

      本文链接:https://www.haomeiwen.com/subject/gkpauktx.html