zoukankan      html  css  js  c++  java
  • Semaphore

    Semaphore(信号量)是用来控制同时访问特定资源的线程数量。

    import java.util.concurrent.*;
    
    /**
     * Created by Administrator on 2017/5/22 0022.
     */
    public class Test {
    
        private static final int THREAD_COUNT = 10;//并发为10
    
        private static ExecutorService threadPool = Executors
                .newFixedThreadPool(THREAD_COUNT);
    
        private static Semaphore s = new Semaphore(3); //设置最大访问量为3个
    
        public static void main(String[] args) {
            for (int i = 0; i < THREAD_COUNT; i++) {
                threadPool.execute(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            s.acquire();
                   Thread.sleep(3000); System.out.println(
    "save data"); s.release(); } catch (InterruptedException e) { } } }); } threadPool.shutdown(); } }

    从上面代码看出来给它10个线程,但是每次只允许3个并发的执行。

    通过上面例子,来分析一下源码

    构造函数

    Semaphore(int permits) 接受一个整型的数字,表示可用的许可证数量,也是默认的非公平性模式

    Semaphore(int permits,boolean fair)创建公平性还是非公平性模式

    acquire()

    acquire()从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。获取一个许可(如果提供了一个)并立即返回,将可用的许可数减 1。

    如果没有可用的许可,则在发生以下两种情况之一前,禁止将当前线程用于线程安排目的并使其处于休眠状态:

    release()
       方法,并且当前线程是下一个要被分配许可的线程;或者
    • 其他某些线程中断当前线程。

     

    • 被此方法将其已中断状态设置为 on ;或者
    • 在等待许可时被中断

    InterruptedException,并且清除当前线程的已中断状态。 

    抛出:
    InterruptedException - 如果当前线程被中断

     Semaphore还提供一些其他方法:

    • int availablePermits() :返回此信号量中当前可用的许可证数。
    • int getQueueLength():返回正在等待获取许可证的线程数。
    • boolean hasQueuedThreads() :是否有线程正在等待获取许可证。
    • void reducePermits(int reduction) :减少reduction个许可证。是个protected方法。
    • Collection getQueuedThreads() :返回所有等待获取许可证的线程集合。是个protected方法。
  • 相关阅读:
    error: readline/readline.h: No such file or directory
    ImportError: No module named setuptools
    ImportError: No module named argparse
    为python安装pip
    yum源安装配置
    n元一维向量向左循环移位i的几种算法
    以空间换时间编程策略的细节问题以及解决方案
    Hash(散列函数)简单应用引出解决散列冲突的四种方法
    随机取样
    排序问题
  • 原文地址:https://www.cnblogs.com/gudulijia/p/6893959.html
Copyright © 2011-2022 走看看