Java Semaphore示例
时间:2020-02-23 14:35:10 来源:igfitidea点击:
在本教程中,我们将在Java中看到java的信号量。
Semaphore是Java.util.concurrent包中的程序。
在JDK 5.信号量基本上维护了一组允许,因此有两种方法主要用于信号量。
- acquire
- release
acquire()方法用于获得许可,如果不是。
许可证达到Max允许的许可,然后线程必须等待获取允许通过调用Release()方法来由某些其他线程释放的许可。
信号量通常用于限制访问资源的线程数。
实时示例:
- 信号量可用于一次限制数据库连接的数量
- 信号量也可用于绑定任何收集。
例子:
我们将创建一个CloundedArrayList,一次只能拥有5个元素。
如果任何线程想要将更多元素添加到列表中,则线程将必须等到任何其他线程从列表中删除元素。
当我们向列表添加一个元素时,我们将调用Semaphore.acquire,当我们从列表中删除一个元素时,我们将调用信号量。
详细信息。
创建一个名为buneredArrayList的类。
package org.igi.theitroad.bean; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.Semaphore; public class BoundedArrayList { private final Semaphore semaphore; private List arraylist; BoundedArrayList(int limit) { this.arraylist = Collections.synchronizedList(new ArrayList()); semaphore = new Semaphore(limit); } /* * Add element to the list and call semaphore.acquire method * */ public boolean add(T t) throws InterruptedException { boolean added = false; semaphore.acquire(); try { added = arraylist.add(t); return added; } finally { if (!added) semaphore.release(); } } /* * remove element from the list and call semaphore.release method * */ public boolean remove(T t) { boolean wasRemoved = arraylist.remove(t); if (wasRemoved) semaphore.release(); return wasRemoved; } public void remove(int index) { arraylist.remove(index); semaphore.release(); } public List getArraylist() { return arraylist; } public Semaphore getSemaphore() { return semaphore; } }
创建一个主类BuindedArrayListmain.java
package org.igi.theitroad.bean; public class BoundedArrayListMain { public static void main(String[] args) throws InterruptedException { final BoundedArrayList ba = new BoundedArrayList(5); Runnable runnable1 = new Runnable() { @Override public void run() { try { ba.add("John"); ba.add("Martin"); ba.add("Adam"); ba.add("Prince"); ba.add("Tod"); System.out.println("Available Permits : "+ba.getSemaphore().availablePermits()); ba.add("Tony"); System.out.println("Final list: "+ba.getArraylist()); } catch (InterruptedException ie) { } } }; Runnable runnable2 = new Runnable() { @Override public void run() { try { System.out.println("Before removing elements: "+ ba.getArraylist()); Thread.sleep(5000); ba.remove("Martin"); ba.remove("Adam"); } catch (InterruptedException e) { e.printStackTrace(); } } }; Thread t1 = new Thread(runnable1); Thread t2 = new Thread(runnable2); t1.start(); t2.start(); } }
运行上面的程序时,我们将得到以下输出:
Available Permits : 0 Before removing elements: [John, Martin, Adam, Prince, Tod] Final list: [John, Prince, Tod, Tony]
解释:
- 我们创建了两个线程t1和t2.
- T1和T2都共享公共列表参考BA。
- 当T1将5个元素添加到列表中时,可用许可证变为0。
- 现在T1等待另一个线程删除元素,以便信号量有一些可用的许可。
- 在等待5秒后,另一个线程T2从列表中删除元素。
- 一旦T2删除元素,T1将"Tony"添加到列表中。