Semaphore维护当前访问自身的线程个数

简介: 可以实现流量控制,同时访问文件的用户数import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;public class SemaphoreTest {    public static void ma

可以实现流量控制,同时访问文件的用户数

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

public class SemaphoreTest {
    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        final  Semaphore sp = new Semaphore(3);//创建Semaphore信号量,初始化许可大小为3
        Runnable runnable = new Runnable(){
            public void run(){
            try {
                sp.acquire();//请求获得许可,如果有可获得的许可则继续往下执行,许可数减1。否则进入阻塞状态
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            System.out.println("线程" + Thread.currentThread().getName() + 
                    "进入,当前已有" + (3-sp.availablePermits()) + "个并发");
            try {
                Thread.sleep((long)(Math.random()*10000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程" + Thread.currentThread().getName() + 
                    "即将离开");                    
            sp.release();//释放许可,许可数加1
            //下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
            System.out.println("线程" + Thread.currentThread().getName() + 
                    "已离开,当前已有" + (3-sp.availablePermits()) + "个并发");                    
        }
    };
        for(int i=0;i<10;i++){
            service.execute(runnable); //提交十个任务           
        }
    }                                                                                                                   

}


本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1716824

目录
相关文章
|
1天前
|
Python
如何在Python中使用Semaphore来实现线程同步?
如何在Python中使用Semaphore来实现线程同步?
28 7
|
1天前
|
存储 Java 数据库连接
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
35 0
|
1天前
|
安全 Java C++
多线程之Callable接口、ReentrantLock、信号量 Semaphore以及CountDownLatch
多线程之Callable接口、ReentrantLock、信号量 Semaphore以及CountDownLatch
|
1天前
学习多线程之Semaphore工具解释
学习多线程之Semaphore工具解释
32 0
|
1天前
多线程并发之Semaphore(信号量)使用详解
多线程并发之Semaphore(信号量)使用详解
117 0
|
1天前
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
34 0
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
|
9月前
|
数据库连接 数据库
多线程进阶学习11------CountDownLatch、CyclicBarrier、Semaphore详解
多线程进阶学习11------CountDownLatch、CyclicBarrier、Semaphore详解
56 0
|
9月前
|
Java
【并发技术14】线程同步工具Semaphore的使用
【并发技术14】线程同步工具Semaphore的使用
|
12月前
并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量
并发编程-17AQS同步组件之 Semaphore 控制并发线程数的信号量
44 0
|
12月前
|
Java
Java多线程:Semaphore
Java多线程:Semaphore
86 0