原创转载请注明出处: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数量,仅仅是初始的状态值。