aemaphore信号灯,控制线程个数,如:一个文件只能同时被3个线程执行,固定个数的信号灯如3个,当有多个线程时,只能是先拿到信号灯的线程执行,同时只有三个线程在执行
main(){
ExecutorService service=Executors.newCachedThreadPool();
1final Semaphore sp=new Semaphore(3);默认随机分配给其他线程,final是为了让内部类使用
2final Semaphore sp=new Semaphore(3,true); 也可以让他公平分配,先进的线程先获得灯。
for(i<10){Runnable r=new Runnable(){run(){
sp.acquire();执行代码;sp.avaliablePermits();sp.release();用完释放等给其他线程};
获得信号灯;并显示还剩几盏灯可获得。
service.execute(r); }}扔进10个任务,开启10个线程,但只能同时执行3个线程
单个信号灯实现互斥功能,比锁要好!锁是那个线程拿到锁谁来释放,一旦抛异常,就不能再释放,必须用finally释放,而信号灯就算抛异常结束,也可自己sp.release();释放。
|
|