Semaphore的学习

发表时间:2017-09-07 16:44:06 浏览量( 15 ) 留言数( 0 )

学习目标:

1、了解Semaphore

2、在实践中灵活使用Semaphore


学习过程:

一、Semaphore简介

   Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。另外重入锁 ReentrantLock 也可以实现该功能,但实现上要复杂些。 


二、示例代码

    模拟这样的一个例子,一个餐馆最多只能进去5个人进去,如果现在有30个人要进入这个餐馆,那么就必须排队,开始先进去5个人,有一个人吃完出来了,这时候就可以进去一个人了。

任务类:

public class SeTask implements Runnable {

	private int taskId;
	private String taskName;
	private Semaphore semaphore;

	public SeTask(int taskId, String taskName,Semaphore semaphore) {
		this.taskId = taskId;
		this.taskName = taskName;
		this.semaphore=semaphore;
	}

	@Override
	public void run() {
		try {
			
			//System.out.println("run taskId =" + this.taskId+"尝试进来房间。。。。");
			semaphore.acquire();
			System.out.println("run taskId =" + this.taskId+"进来了。。。。");
			Thread.sleep(1000);
			// 访问完后,释放
			semaphore.release();
			System.out.println("end taskId =" + this.taskId);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public String toString() {
		return Integer.toString(this.taskId);
	}

}

测试:

public class TestSemaphore {
	public static void main(String[] args) throws InterruptedException {

		final Semaphore semaphore = new Semaphore(5);// 定义为

		ExecutorService pool = Executors.newCachedThreadPool();//这样使用CachedThreadPool,进来一个线程就处理一个
		 for (int i = 0; i < 30; i++) {
			 SeTask mt1 = new SeTask(i, "任务"+i,semaphore);
			 pool.execute(mt1);
		 }

		System.out.println("主线程可以继续执行了。。。");

	}
}

运行结果:

run taskId =0进来了。。。。

run taskId =2进来了。。。。

run taskId =1进来了。。。。

run taskId =3进来了。。。。

run taskId =4进来了。。。。

主线程可以继续执行了。。。

end taskId =0

end taskId =3

run taskId =8进来了。。。。

end taskId =1

end taskId =2

run taskId =7进来了。。。。

run taskId =5进来了。。。。

run taskId =6进来了。。。。

run taskId =9进来了。。。。

end taskId =4

run taskId =10进来了。。。。

end taskId =8

end taskId =6

run taskId =14进来了。。。。

end taskId =5

end taskId =7

run taskId =11进来了。。。。

run taskId =13进来了。。。。

run taskId =12进来了。。。。

end taskId =9

end taskId =11

end taskId =13

end taskId =14

end taskId =10

run taskId =20进来了。。。。

run taskId =17进来了。。。。

run taskId =18进来了。。。。

run taskId =16进来了。。。。

end taskId =12

run taskId =19进来了。。。。

run taskId =23进来了。。。。

end taskId =18

end taskId =17

run taskId =15进来了。。。。

run taskId =28进来了。。。。

run taskId =22进来了。。。。

end taskId =16

end taskId =20

end taskId =19

run taskId =27进来了。。。。

end taskId =22

end taskId =23

end taskId =28

run taskId =25进来了。。。。

run taskId =24进来了。。。。

run taskId =29进来了。。。。

run taskId =26进来了。。。。

end taskId =15

run taskId =21进来了。。。。

end taskId =27

end taskId =24

end taskId =25

end taskId =29

end taskId =26

end taskId =21