Semaphore实现并发数限制

标签: 并发编程
5人阅读 评论(0) 收藏 举报
分类:

百度百科解释:Semaphore是一种在多线程环境下使用的设施,该设施负责协调各个线程,以保证它们能够正确、合理的使用公共资源的设施,也是操作系统中用于控制进程同步互斥的量。

Semaphore是java并发包下的一个工具类,可以控制多线程对共享资源的访问,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。如某个方法只允许最多10个线程并发访问,则实现代码如下:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoreDemo {

    public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool();
        // 最多10个线程同时访问
        final Semaphore semaphore = new Semaphore(10);
        // 20个线程同时启动
        for (int i = 1; i <= 20; i++) {
            final int index = i;
            exec.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        // 获取许可
                        semaphore.acquire();
                        // 调用资源
                        callRomote(index);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        // 访问完后,释放
                        semaphore.release();
                        //availablePermits()指的是当前库中有多少个许可可以被使用
                        System.out.println("availablePermits => " + semaphore.availablePermits());
                    }
                }
            });
        }
        // 退出线程池
        exec.shutdown();
    }

    /**
     * 被调用资源
     *
     * @param arg
     */
    public static void callRomote(int arg) {
        System.out.println("arg: " + arg);
        try {
            Thread.sleep((long) (Math.random() * 6000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
查看评论

使用Filter限制J2EE最大并发数

在开发J2EE的过程往往需要限制并发请求量从而减少服务器异常的可能性。而这些通常都是通过集群手段或外部代理来实现的。本文主要介绍单个应用如何不依赖其他程序来解决这个问题。 J2EE的每个请求都是经由过...
  • zyb134506
  • zyb134506
  • 2014-12-03 09:56:16
  • 3011

Semaphore 控制并发访问线程数

Semaphore, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 /** * Semaphore 信号量 控制并发访问的线程数 */ ExecutorS...
  • shineflowers
  • shineflowers
  • 2015-12-28 10:38:20
  • 1219

java多线程Semaphore使用实例,细化粒度控制并发数量

1、Semaphore:线程协同类,用来控制线程并发数量,并且可以更加细粒度的进行控制,因为真正被控制最大并发的代码放到了acquire和release之间。 2、主要方法: //初始值 co...
  • javaloveiphone
  • javaloveiphone
  • 2017-02-07 11:33:22
  • 1249

JAVA中的并发工具类(一)----控制并发数的Semaphore

本文使用的Demo可以在我的github中找到。 前面我们使用线程池技术来控制访问资源的线程数目,假设对某一文件的访问,我们允许几十个线程来读他,但是出于某种限制,我们要求只允许10个线程可以同时读...
  • qq_16811963
  • qq_16811963
  • 2016-08-11 16:23:23
  • 1818

(java多线程并发)控制并发线程数的Semaphore、ScheduledThreadPoolExcutor、BlockingQueue、ReadWriteLock

控制并发线程数的Semaphore 1.简介    信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公...
  • truelove12358
  • truelove12358
  • 2016-12-06 11:17:45
  • 639

Semaphore 并发个数控制

Semaphore可以控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。 ...
  • cbjcry
  • cbjcry
  • 2017-04-13 10:32:42
  • 54

iOS GCD中如何控制最大并发数

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄 一、概述 1、GCD并发的困扰 在GCD中有两种队列,分别是串行队列和并发队列。在串行队列中,同一时间只有...
  • shihuboke
  • shihuboke
  • 2017-08-05 23:37:07
  • 1239

Nginx 限制IP并发数及速度

估计不少站长遇到了与我相同的问题,同时访问人数过多,或者同一个人在不停的刷新页面,请求服务器资源,或者用户使用下载工具(IDM或迅雷等)下载资源时,网站扛不住并发压力,而导致网站瘫痪,出现502错误,...
  • hewy0526
  • hewy0526
  • 2013-07-05 09:31:24
  • 1587

线程池的饱和策略-Semaphore实现任务提交限制

java并发编程实践阅读笔记之线程池的使用         当线程池的工作队列被填满后,如果没有预定义的饱和策略来阻塞任务的执行,则可以通过信号量Semaphore来限制任务的到达率。Semaph...
  • wojiushiwo945you
  • wojiushiwo945you
  • 2014-12-15 16:11:32
  • 1899

http并发限制数目

IE和Firefox对同一域名进行请求的并发连接数限制文章分类:Web前端从Yahoo! 关于网站优化的经典14条建议,在V2版中,已经更新到35条了,参见网址:http://developer.y...
  • xcyuzhen
  • xcyuzhen
  • 2011-03-17 09:24:00
  • 1372
    个人资料
    持之以恒
    等级:
    访问量: 6606
    积分: 234
    排名: 29万+