Java并发工具类---控制并发线程数的Semaphore

 Semaphore(信号量)用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。
 其实,Semaphore就好比交通灯,用于控制车流,车子就好比线程。

应用场景

 Semaphore可以用于做流量控制,特别是公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发地读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有10个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连接。这个时候,就可以使用Semaphore来做流量控制。

SemaphoreTest.java

public class SemaphoreTest { 
	private static final int THREAD_COUNT = 30; 
	private static ExecutorServicethreadPool = Executors.newFixedThreadPool(THREAD_COUNT); 
	private static Semaphore s = new Semaphore(10); 
	public static void main(String[] args) { 
		for (inti = 0; i< THREAD_COUNT; i++) { 
			threadPool.execute(new Runnable() { 
				@Override 
				public void run() { 
					try { 
						s.acquire();
						System.out.println("save data"); 
						s.release(); 
					} catch (InterruptedException e) { 
					} 
				} 
			});
		} 
		threadPool.shutdown(); 
	} 
}

 在代码中,虽然有30个线程在执行,但是只允许10个并发执行。Semaphore的构造方法 Semaphore(int permits) 接受一个整型的数字,表示可用的许可证数量。Semaphore(10)表示允 许10个线程获取许可证,也就是最大并发数是10。Semaphore的用法也很简单,首先线程使用 Semaphore的acquire() 方法获取一个许可证,使用完之后调用release() 方法归还许可证。还可以用tryAcquire() 方法尝试获取许可证。

其他方法

Semaphore还提供一些其他方法,具体如下。 ·

  • intavailablePermits():返回此信号量中当前可用的许可证数。
  • intgetQueueLength():返回正在等待获取许可证的线程数。
  • booleanhasQueuedThreads():是否有线程正在等待获取许可证。
  • void reducePermits(int reduction):减少reduction个许可证,是个protected方法。
  • Collection getQueuedThreads():返回所有等待获取许可证的线程集合,是个protected方法。

你可能感兴趣的:(笔记)