1、Semaphore可以控同时访问的线程个数
2、Semaphore类位于java.util.concurrent包下,它提供了2个构造器:
12345678 | //参数permits表示许可数目,即同时可以允许多少线程进行访问public Semaphore(int permits) { sync = new NonfairSync(permits);}//这个多了一个参数fair表示是否是公平的,即等待时间越久的越先获取许可public Semaphore(int permits, boolean fair) { sync = (fair)? new FairSync(permits) : new NonfairSync(permits);} |
---|
3、重要方法,acquire()、release()方法:
1234 | public void acquire() throws InterruptedException { } //获取一个许可public void acquire(int permits) throws InterruptedException { } //获取permits个许可public void release() { } //释放一个许可public void release(int permits) { } //释放permits个许可 |
---|
12345678 | //尝试获取一个许可,若获取成功,则立即返回true,若获取失败,则立即返回falsepublic boolean tryAcquire() { }; //尝试获取一个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回falsepublic boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException { }; //尝试获取permits个许可,若获取成功,则立即返回true,若获取失败,则立即返回falsepublic boolean tryAcquire(int permits) { }; //尝试获取permits个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回falsepublic boolean tryAcquire(int permits, long timeout, TimeUnit unit) throws InterruptedException { }; |
---|
12345678910111213141516171819202122232425262728293031323334 | public class TestSemaphore { private static final Semaphore semaphore=new Semaphore(5,true); //创建5个信号量同时用与读文件 private static final ReentrantReadWriteLock rwLock= new ReentrantReadWriteLock(); private static final Lock rLock=rwLock.readLock(); //获取读锁 public static void main(String[] args) { //执行10个线程,通过信号量控制,只能5个线程5个线程的执行 for (int i = 0; i < 10; i++) { MyThread thread=new MyThread(); thread.setName("线程"+(i+1)); thread.start(); } } static class MyThread extends Thread{ @Override public void run() { reader(); } //读方法 public void reader(){ rLock.lock(); //获取读锁 try { semaphore.acquire(); //获取信号量,信号量-1,如果没有成功获取,那么阻塞 System.out.println(this.getName()+"正在读文件"); Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); }finally{ semaphore.release(); //释放信号量 rLock.unlock(); //释放锁 } } }} |
---|