关于信号量Semaphore


如何解决高并发:
1、网络层面
2、服务层面:业务最主要。分流,负载均衡等等。Nginx
3、Java代码:限流策略

下面是讲Java中的限流,keyi使用的是Semaphore。
public class UseSemaphore {
	public static void main(String[] args) {
		final Semaphore semaphore = new Semaphore(5);  //可以看到Semaphore的构造函数需要传递一个int类型数据,作用是限流,只能有5个线程同时访问
		ExecutorService pool = Executors.newCachedThreadPool();  //线程池
		for(int i=0;i<20;i++){ //模拟20个客户端访问
			int j = i+1;
			Runnable run = new Runnable(){
				@Override
				public void run() {
					try {
						//获取许可
						semaphore.acquire();  
						//模拟实际业务员逻辑
						//Thread.sleep(1000 * new Random().nextInt(5));
						Thread.sleep(2000); 
						System.out.println("任务"+j+"完成!");
						//访问完后,释放
						semaphore.release();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
			};
			pool.execute(run);
		}
	}
}
执行结果:如果是随机休眠的话,效果不是特别明显,但是休眠同一时间就很明显了,每次出来都是五个任务,就是说每次只能5个线程同时访问。
任务2完成!
任务5完成!
任务4完成!
任务1完成!
任务3完成!
任务6完成!
任务9完成!
任务10完成!
任务7完成!
任务8完成!
任务12完成!
任务11完成!
任务13完成!
任务16完成!
任务14完成!
任务15完成!
任务20完成!
任务18完成!
任务17完成!
任务19完成!

猜你喜欢

转载自blog.csdn.net/howinfun/article/details/80847243