Semaphore 信号量-0
1.构造方法
同步关键类 Semaphore
permits 是允许许可的意思
构造方法传入的数字是多少,则同一个时刻,只运行多少个进程同时运行指定代码
指定代码就是 在 semaphore.acquire() 和 semaphore.release()之间的代码
private Semaphore semaphore = new Semaphore(2);
package com.lhc.concurrent.semaphore;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Semaphore;
public class ConstructionService {
private static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
/**
* 同步关键类
* permits 是允许许可的意思
* 构造方法传入的数字是多少,则同一个时刻,只运行多少个进程同时运行指定代码
* 指定代码就是 在 semaphore.acquire() 和 semaphore.release()之间的代码
*/
private Semaphore semaphore = new Semaphore(2);
public void doSomething() {
try {
/**
* 在 semaphore.acquire() 和 semaphore.release()之间的代码,同一时刻只允许指定个数的线程进入,
* 因为semaphore的构造方法是1,则同一时刻只允许一个线程进入,其他线程只能等待。
* */
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + ":开始执行,时间:" + getFormatTimeStr());
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + ":执行结束,时间:" + getFormatTimeStr());
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static String getFormatTimeStr() {
return sf.format(new Date());
}
}
2.测试类
package com.lhc.concurrent.semaphore;
public class SemaphoreThread extends Thread{
private ConstructionService constructionService;
public SemaphoreThread(ConstructionService constructionService, String name) {
super();
this.constructionService = constructionService;
this.setName(name);
}
public static void main(String[] args) {
ConstructionService constructionService = new ConstructionService();
for (int i = 0; i < 10; i++) {
SemaphoreThread semaphoreThread = new SemaphoreThread(constructionService, "线程" + i);
semaphoreThread.start();
}
}
@Override
public void run() {
constructionService.doSomething();
}
}
3.执行结果
线程0:开始执行,时间:2019-04-13 10:08:44.290
线程1:开始执行,时间:2019-04-13 10:08:44.290
线程1:执行结束,时间:2019-04-13 10:08:46.294
线程0:执行结束,时间:2019-04-13 10:08:46.294
线程3:开始执行,时间:2019-04-13 10:08:46.294
线程2:开始执行,时间:2019-04-13 10:08:46.294
线程2:执行结束,时间:2019-04-13 10:08:48.306
线程3:执行结束,时间:2019-04-13 10:08:48.306
线程5:开始执行,时间:2019-04-13 10:08:48.306
线程6:开始执行,时间:2019-04-13 10:08:48.306
线程6:执行结束,时间:2019-04-13 10:08:50.318
线程5:执行结束,时间:2019-04-13 10:08:50.318
线程4:开始执行,时间:2019-04-13 10:08:50.318
线程7:开始执行,时间:2019-04-13 10:08:50.318
线程7:执行结束,时间:2019-04-13 10:08:52.320
线程4:执行结束,时间:2019-04-13 10:08:52.320
线程8:开始执行,时间:2019-04-13 10:08:52.320
线程9:开始执行,时间:2019-04-13 10:08:52.320
线程9:执行结束,时间:2019-04-13 10:08:54.324
线程8:执行结束,时间:2019-04-13 10:08:54.324