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"添加到列表中。