semaphore是java.util.concurrent包下的并发工具类。
A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each acquire() blocks if necessary until a permit is available, and then takes it. Each release() adds a permit, potentially releasing a blocking acquirer. However, no actual permit objects are used; the semaphore just keeps a count of the number available and acts accordingly.Semaphores are often used to restrict the number of threads than can access some (physical or logical) resource.
大致意思是semaphore可以持有许可证,可以在初始化时指定,执行一次acquire(),获取一个许可证,线程进入,当许可证为0,则不再允许线程进入,执行一次release释放一个许可证。
package com.smikevon.concurrent.tools;import java.util.Random; import java.util.concurrent.Semaphore;/*** @description: 有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C.要求, 同时启动三个线程, 按顺序输出ABC, 循环10次* @date : 2014年9月17日 下午8:23:05*/ public class TestSemaphore {public static void main(String[] args) {final Semaphore sa = new Semaphore(1);final Semaphore sb = new Semaphore(0);final Semaphore sc = new Semaphore(0);final Random random = new Random(System.currentTimeMillis());new Thread(new Runnable() {public void run() {try {while(true){Thread.sleep(random.nextInt(3000));sa.acquire();doing("A");sb.release();}} catch (InterruptedException e) {e.printStackTrace();}}},"线程a").start();new Thread(new Runnable() {public void run() {try {while(true){Thread.sleep(random.nextInt(3000));sb.acquire();doing("B");sc.release();}} catch (InterruptedException e) {e.printStackTrace();}}},"线程b").start();new Thread(new Runnable() {public void run() {try {while(true){Thread.sleep(random.nextInt(3000));sc.acquire();doing("C");sa.release();}} catch (InterruptedException e) {e.printStackTrace();}}},"线程c").start();}/*** @Description:打印出线程的名字* @param msg* @returType:void*/public static void doing(String msg){System.out.println(Thread.currentThread().getName()+":"+msg);}}