多线程11-Semaphore信号灯

1.概念

       Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数

2.案例

package org.lkl.thead.foo;



import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Semaphore;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;



/**

 * 

 * Function : 信号灯

 * @author : Liaokailin

 * CreateDate : 2014-6-19

 * version : 1.0

 */

public class SemaphoreFoo {

    

    public static void main(String[] args) {

        ExecutorService threadPool = Executors.newCachedThreadPool() ;

        final Semaphore sp = new Semaphore(3) ; //3个信号等

        for(int i= 1 ;i<=10 ;i++){

            Runnable runnable = new Runnable() {

                

                @Override

                public void run() {

                    



                        //获取一个信号灯

                        try {

                            sp.acquire() ;

                        } catch (InterruptedException e) {

                            e.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() ; //释放信号灯 此时其他线程就可以抢占释放的信号灯

                            

                            //下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元

                            System.out.println("线程" + Thread.currentThread().getName() + 

                                    "已离开,当前已有" + (3-sp.availablePermits()) + "个并发");

                        

                }

            };

            

            

            threadPool.execute(runnable) ; //线程启动.

        }

    }

}

 

 

你可能感兴趣的:(Semaphore)