Java多线程与并发库高级应用之信号量Semaphore
2013-12-19 17:14
567 查看
JDK1.5提供了一个计数信号量Semaphore类。Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目,并提供了同步机制。
Semaphore提供了两个构造器来创建对象:
1)Semaphore(int permits):创建具有给定的许可数和非公平的公平设置的Semaphore。
2)Semaphore(int permits, boolean fair):创建具有给定的许可数和给定的公平设置的Semaphore。如果此信号量保证在争用时按先进先出的顺序授予许可,则为true,否则为false。
如果线程要运行首先要获取信号量,调用信号量的acquire()方法。当某线程执行完后要释放信号量,调用信号量的release()方法。
实现一个同时只允许3个线程并发访问的程序。
运行程序,看到同时只有3个线程并发执行。
Semaphore提供了两个构造器来创建对象:
1)Semaphore(int permits):创建具有给定的许可数和非公平的公平设置的Semaphore。
2)Semaphore(int permits, boolean fair):创建具有给定的许可数和给定的公平设置的Semaphore。如果此信号量保证在争用时按先进先出的顺序授予许可,则为true,否则为false。
如果线程要运行首先要获取信号量,调用信号量的acquire()方法。当某线程执行完后要释放信号量,调用信号量的release()方法。
实现一个同时只允许3个线程并发访问的程序。
public class SemaphoreDemo { public static void main(String[] args) { //定义一个信号数为3的信号量 final Semaphore semaphore = new Semaphore(3); //线程池 ExecutorService pool = Executors.newCachedThreadPool(); //创建10个线程 for(int i = 0; i < 10; i++){ Runnable target = new Runnable(){ @Override public void run() { try { //获取信号量 semaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程-" + Thread.currentThread().getName() + "-已进入,当前已有" + (3-semaphore.availablePermits()) + "个线程并发"); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("线程-" + Thread.currentThread().getName() + "-准备离开,当前已有" + (3-semaphore.availablePermits()) + "个线程并发"); //释放信号量 semaphore.release(); System.out.println("线程-" + Thread.currentThread().getName() + "-离开,当前已有" + (3-semaphore.availablePermits()) + "个线程并发"); } }; pool.execute(target); } pool.shutdown(); } }
运行程序,看到同时只有3个线程并发执行。
相关文章推荐
- Java多线程与并发库高级应用-工具类介绍
- Java多线程与并发库高级应用
- Java多线程与并发库高级应用05
- Java多线程与并发库高级应用之公共屏障点CyclicBarrier
- Java多线程与并发库高级应用-可阻塞的队列
- java多线程并发库高级应用 之 java5中的线程并发库--线程池、Callable&Future
- Java多线程与并发库高级应用之线程池
- 黑马程序员_java多线程与并发库高级应用
- Java多线程与并发库高级应用之信号量Semaphore
- Java多线程与并发库高级应用之倒计时计数器
- java多线程并发库高级应用 之 多个线程之间共享数据的方式探讨
- 张孝祥_Java多线程与并发库高级应用03
- JAVA多线程并发库高级应用 (四)
- Java多线程与并发库高级应用-面试题
- 张孝祥_Java多线程与并发库高级应用04
- Java多线程与并发库高级应用之线程池
- Java多线程与并发库高级应用-同步集合
- Java多线程与并发库高级应用之公共屏障点CyclicBarrier
- Java多线程与并发库高级应用-传统定时器技术回顾
- Java多线程与并发库高级应用之Callable和Future