浅谈jdk中Semaphore的用法
Semaphore类位于java.util.concurrent包下,通过Semaphore可以很轻松的完成对信号量的控制,通过对信号量的控制可以达到对资源访问的控制,不过Semaphore类只是一个资源数量的抽象表示,并不负责管理资源本身,可能会有多个线程同时访问一个资源,需要做好同步处理。主要方法如下:
public void acquire() throws InterruptedException {}
public void release() {}
acquire方法用于获取一个资源访问许可,如果没有方法会阻塞,其构造方法中可以指定公平获取还是竞争获取;release用于释放一个许可。完整例子如下:
import java.util.Random;
import java.util.concurrent.Semaphore;
public class SemaphoreDemo {
public static void main(String[] args) {
int resource = 4;
Semaphore semaphore = new Semaphore(resource);
System.out.println("开始分配任务。。。");
for (int i = 0; i < resource + 3; i++) {
new Worker(semaphore).start();
}
}
static class Worker extends Thread {
private Semaphore semaphore;
public Worker(Semaphore semaphore) {
this.semaphore = semaphore;
}
@Override
public void run() {
try {
System.out.println("Thread:" + Thread.currentThread().getName() + " try to get resource ");
semaphore.acquire();
System.out.println("Thread:" + Thread.currentThread().getName() + " got resource and working ... ");
Thread.sleep(3000 + new Random().nextInt(5000));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
System.out.println("Thread:" + Thread.currentThread().getName() + " release resource");
}
}
}
}