原创转载请注明出处:http://agilestyle.iteye.com/blog/2342898
有参方法acquire(int permits)表示每调用1次此方法,就使用Semaphore中的x个permits
Service.java
package org.fool.java.concurrent.semaphore.acquire; import java.util.concurrent.Semaphore; public class Service { private Semaphore semaphore = new Semaphore(10); public void testMethod() { try { semaphore.acquire(2); System.out.println(Thread.currentThread().getName() + " begin timer=" + System.currentTimeMillis()); int sleepValue = 5000; System.out.println(Thread.currentThread().getName() + " stop " + (sleepValue / 1000) + " sec"); Thread.sleep(sleepValue); System.out.println(Thread.currentThread().getName() + " end timer=" + System.currentTimeMillis()); semaphore.release(2); } catch (InterruptedException e) { e.printStackTrace(); } } }
Note:
private Semaphore semaphore = new Semaphore(10);
定义10个permits,每次执行semaphore.acquire(2);消耗掉2个,所以10/2=5,说明同一时间只允许5个线程执行acquire()和release()之间的代码。
ThreadA.java
package org.fool.java.concurrent.semaphore.acquire; public class ThreadA implements Runnable { private Service service; public ThreadA(Service service) { this.service = service; } @Override public void run() { service.testMethod(); } }
SemaphoreTest.java
package org.fool.java.concurrent.semaphore.acquire; public class SemaphoreTest { public static void main(String[] args) throws InterruptedException { Service service = new Service(); for (int i = 0; i < 10; i++) { new Thread(new ThreadA(service)).start(); } } }
Run
如果多次调用Semaphore的release()或release(int)方法时,还可以动态增加permits的个数。
package org.fool.java.concurrent.semaphore.acquire; import java.util.concurrent.Semaphore; public class SemaphoreTest2 { public static void main(String[] args) { try { Semaphore semaphore = new Semaphore(5); semaphore.acquire(); semaphore.acquire(); semaphore.acquire(); semaphore.acquire(); semaphore.acquire(); System.out.println(semaphore.availablePermits()); // outputs 0 semaphore.release(); semaphore.release(); semaphore.release(); semaphore.release(); semaphore.release(); semaphore.release(); System.out.println(semaphore.availablePermits()); // outputs 6 semaphore.release(4); System.out.println(semaphore.availablePermits()); // outputs 10 } catch (InterruptedException e) { e.printStackTrace(); } } }
Note:
Semaphore semaphore = new Semaphore(5);
定义的5并不是最终的permits数量,仅仅是初始的状态值。