概念
Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。
代码示例
package com.cd.concurrent.semaphore;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Semaphore;
public class SemaphoreService {
private static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
private Semaphore semaphore = new Semaphore(1);// 同步关键类,构造方法传入的数字是多少,则同一个时刻,只运行多少个进程同时运行制定代码
public void doSomething() {
try {
/**
* 在 semaphore.acquire() 和 semaphore.release()之间的代码,同一时刻只允许制定个数的线程进入,
* 因为semaphore的构造方法是1,则同一时刻只允许一个线程进入,其他线程只能等待。
* */
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + ":doSomething start-" + getFormatTimeStr());
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + ":doSomething end-" + getFormatTimeStr());
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static String getFormatTimeStr() {
return sf.format(new Date());
}
}
public class SemaphoreTest {
public static void main(String args[]) {
SemaphoreService service = new SemaphoreService();
for (int i = 0; i < 10; i++) {
MyThread t = new MyThread("thread" + (i + 1), service);
t.start();// 这里使用 t.run() 也可以运行,但是不是并发执行了
}
}
}