Semaphore, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。也是操作系统中用于控制进程同步互斥的量,下面我们来看看Java 信号量 Semaphore使用方法
在用Semaphore 信号量的时候,感觉对公平调度比较有用,可以控制多线程争夺资源时候,最大可以几个在执行,随手写了代码测试下,如下:
说明:
1. acquire() 获取一个许可,如果没有就等待
2. release() 释放一个许可
3. Semaphore可以控制某个资源可被同时访问的个数,自行初始化的数量,为1当然就顺序执行了
package com.i5a6.semp.test;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreTest {
private Semaphore semp;
private ExecutorService executorPool;
public SemaphoreTest(int threadNum) {
semp = new Semaphore(threadNum);
executorPool = Executors.newFixedThreadPool(threadNum);
}
public void doEnd() {
this.executorPool.shutdown();
}
public void doMsg(int num) {
try {
semp.acquire();
executorPool.execute(new HelloUExecutor(num));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
class HelloUExecutor implements Runnable {
private int num;
public HelloUExecutor(int num) {
this.num = num;
}
Random r = new Random();
@Override
public void run() {
try {
System.out.println(num);
Thread.sleep(r.nextInt(1000));
} catch (Exception e) {
e.printStackTrace();
} finally {
semp.release();
}
}
}
public static void main(String[] args) {
// 初始化为1 顺序执行
SemaphoreTest st = new SemaphoreTest(5);
for (int i = 0; i < 20; i ) {
st.doMsg(i);
}
st.doEnd();
}
}