使用Semaphore控制某个方法允许并发访问的线程的个数

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

Semaphore两个重要的方法就是

semaphore.acquire() 请求一个信号量,这时候的信号量个数-1(一旦没有可使用的信号量,也即信号量个数变为负数时,再次请求的时候就会阻塞,直到其他线程释放了信号量)

semaphore.release() 释放一个信号量,此时信号量个数+1

public class SemaphoreTest {
    private Semaphore mSemaphore = new Semaphore(5);
    public void run(){
        for(int i=0; i< 100; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    test();
                }
            }).start();
        }
    }

    private void test(){
        try {
            mSemaphore.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " 进来了");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " 出去了");
        mSemaphore.release();
    }
}

示例中实例化了具有5个信号量的semaphore,保证只有5个线程在执行test方法

04-18 17:05:46.350 14192-14228/com.tongxt.myapplication I/System.out: Thread-1228 进来了
04-18 17:05:46.351 14192-14231/com.tongxt.myapplication I/System.out: Thread-1231 进来了
04-18 17:05:46.354 14192-14233/com.tongxt.myapplication I/System.out: Thread-1233 进来了
04-18 17:05:46.354 14192-14232/com.tongxt.myapplication I/System.out: Thread-1232 进来了
04-18 17:05:46.355 14192-14234/com.tongxt.myapplication I/System.out: Thread-1234 进来了
04-18 17:05:47.351 14192-14228/com.tongxt.myapplication I/System.out: Thread-1228 出去了
04-18 17:05:47.351 14192-14236/com.tongxt.myapplication I/System.out: Thread-1236 进来了
04-18 17:05:47.352 14192-14231/com.tongxt.myapplication I/System.out: Thread-1231 出去了
04-18 17:05:47.352 14192-14235/com.tongxt.myapplication I/System.out: Thread-1235 进来了
04-18 17:05:47.354 14192-14233/com.tongxt.myapplication I/System.out: Thread-1233 出去了
04-18 17:05:47.354 14192-14237/com.tongxt.myapplication I/System.out: Thread-1237 进来了
04-18 17:05:47.354 14192-14232/com.tongxt.myapplication I/System.out: Thread-1232 出去了
04-18 17:05:47.354 14192-14229/com.tongxt.myapplication I/System.out: Thread-1229 进来了
04-18 17:05:47.356 14192-14234/com.tongxt.myapplication I/System.out: Thread-1234 出去了
04-18 17:05:47.356 14192-14230/com.tongxt.myapplication I/System.out: Thread-1230 进来了
04-18 17:05:48.351 14192-14236/com.tongxt.myapplication I/System.out: Thread-1236 出去了


查看评论

如何控制某个方法允许并发访问线程的个数?

如何控制某个方法允许并发访问线程的个数? 1 package com.soyoungboy; 2 3 import java.util.concurrent.Semaph...
  • ljj_9
  • ljj_9
  • 2018-01-17 15:17:55
  • 362

Semaphore 控制并发访问线程数

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

(java多线程并发)控制并发线程数的Semaphore

1.简介    信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 2.概念     Semap...
  • ZuoAnYinXiang
  • ZuoAnYinXiang
  • 2016-01-02 15:58:49
  • 6237

java 中 如何让一个方法内最多只能指定数量线程访问

//n为指定线程数     public void fun(Thread t) {   SubThread sc = new SubThread();   synchronized (Sub...
  • cheyunlong
  • cheyunlong
  • 2015-11-11 18:20:02
  • 652

进程同步之信号量机制(pv操作)及三个经典同步问题

上篇博客中(进程同步之临界区域问题及Peterson算法),我们对临界区,临界资源,锁机制详细解读了下,留下了一个问题,就是锁机制只能判断临界资源是否被占用,所以他解决了互斥问题,但是他不能确定前面的...
  • SpeedMe
  • SpeedMe
  • 2013-12-27 01:48:29
  • 48426

关于多线程引发的问题,利用semaphore解决

Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。 Semap...
  • luomoBM
  • luomoBM
  • 2017-01-15 23:00:03
  • 232

项目中怎么控制多线程高并发访问 .

synchronized关键字主要解决多线程共享数据同步问题。 ThreadLocal使用场合主要解决多线程中数据因并发产生不一致问题。 ThreadLocal和Synchonized都用...
  • u010942644
  • u010942644
  • 2016-11-27 13:26:29
  • 4267

Java中怎么控制线程访问资源的数量

在API中是这样来描述Semaphore 的 Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。 一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可...
  • u012516914
  • u012516914
  • 2014-11-04 23:30:01
  • 1908

对于并发线程数的设置的一些理解

一些常见问题(1)线程数是不是越大越好? 肯定不是的,首先服务器的cpu核数有限,同时并发的线程数是有限的,1核cpu设置10000个工作线程是没有意义的;线程的切换是有开销的,如果线程切换过于频繁...
  • Megustas_JJC
  • Megustas_JJC
  • 2017-08-29 20:14:23
  • 1478

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

java并发编程实践阅读笔记之线程池的使用         当线程池的工作队列被填满后,如果没有预定义的饱和策略来阻塞任务的执行,则可以通过信号量Semaphore来限制任务的到达率。Semaph...
  • wojiushiwo945you
  • wojiushiwo945you
  • 2014-12-15 16:11:32
  • 1900
    个人资料
    持之以恒
    等级:
    访问量: 17万+
    积分: 2699
    排名: 1万+
    最新评论