java5线程并发库学习之Semaphore

来源:互联网 发布:淘宝卖家后台登陆网址 编辑:程序博客网 时间:2024/05/01 04:45
Semaphore的作用类似Lock的功能,不同的是Semaphore的构造函数中可以传入一个int型的参数,用来确定创建一个多大的通道。


Lock一次只允许一个线程进入,解锁后才允许别的线程进入。而Semaphore可以允许多个线程同时进入,一旦有线程释放就会空出一个位置让另外的线程进入。


相当与Lock是一个单车道,而Semaphore是一个多车道。

[java] view plaincopyprint?
  1. import java.util.Random;  
  2. import java.util.concurrent.ExecutorService;  
  3. import java.util.concurrent.Executors;  
  4. import java.util.concurrent.Semaphore;  
  5.   
  6. public class SemaphoreTest {  
  7.   
  8.     public static void main(String[] args) {  
  9.         ExecutorService es = Executors.newCachedThreadPool();  
  10.         final Semaphore sema = new Semaphore(3true); //表示按排队的先后顺序进入  
  11.         for (int i = 0; i < 10; i++) {  
  12.             es.execute(new Runnable() {  
  13.                 @Override  
  14.                 public void run() {  
  15.                     try {  
  16.                         sema.acquire();  
  17.                     } catch (InterruptedException e) {  
  18.                         e.printStackTrace();  
  19.                     }  
  20.                     System.out.println("线程" + Thread.currentThread().getName() + "已进入,当前有"  
  21.                             + (3 - sema.availablePermits()) + "个线程并发");  
  22.                     try {  
  23.                         Thread.sleep(new Random().nextInt(5000));  
  24.                     } catch (InterruptedException e) {  
  25.                         e.printStackTrace();  
  26.                     }  
  27.                     System.out.println("线程" + Thread.currentThread().getName() + "即将离开");  
  28.                     sema.release(); //一个线程释放就会允许另外的线程进入  
  29.                 }  
  30.             });  
  31.         }  
  32.         es.shutdown();  
  33.     }  
  34. }  



结果:

线程pool-1-thread-2已进入,当前有1个线程并发
线程pool-1-thread-1已进入,当前有2个线程并发
线程pool-1-thread-3已进入,当前有3个线程并发
线程pool-1-thread-2即将离开
线程pool-1-thread-5已进入,当前有3个线程并发
线程pool-1-thread-3即将离开
线程pool-1-thread-4已进入,当前有3个线程并发
线程pool-1-thread-1即将离开
线程pool-1-thread-6已进入,当前有3个线程并发
线程pool-1-thread-5即将离开
线程pool-1-thread-8已进入,当前有3个线程并发
线程pool-1-thread-4即将离开
线程pool-1-thread-7已进入,当前有3个线程并发
线程pool-1-thread-7即将离开
线程pool-1-thread-10已进入,当前有3个线程并发
线程pool-1-thread-6即将离开
线程pool-1-thread-9已进入,当前有3个线程并发
线程pool-1-thread-8即将离开
线程pool-1-thread-9即将离开
线程pool-1-thread-10即将离开

0 0
原创粉丝点击