广州北大青鸟计算机职业培训学校
互联网技术培训、软件技术培训、大数据培训、云计算培训、数据分析培训信息网
当前位置:网站首页 > 软件教程 > Java技术 > 正文

惠州​Java同步器中的信号量是什么?_北大青鸟IT学校

作者:邓华发布时间:2021-05-12分类:Java技术浏览:714


导读:大家知道​Java同步器中的信号量是什么吗?接下来惠州北大青鸟老师给大家介绍一下​Java同步器中的信号量是什么。

大家知道Java同步器中的信号量是什么吗?接下来惠州北大青鸟老师给大家介绍一下Java同步器中的信号量是什么。

信号量用于控制可以访问资源的线程数。

java.util.concurrent包中的Semaphore类表示信号量同步器。

您可以使用其构造函数创建信号量,如下所示:

final int MAX_PERMITS  = 3;
Semaphore  s = new Semaphores(MAX_PERMITS);

Semaphore类的另一个构造函数使用公平作为第二个参数

final int MAX_PERMITS  = 3;
Semaphore  s = new Semaphores(MAX_PERMITS,  true); // A  fair  semaphore

如果你创建一个公平的信号量,在多线程请求许可的情况下,信号量将保证先进先出(FIFO)。也就是说,首先请求许可的线程将首先获得许可。

要获取许可证,请使用acquire()方法。

如果许可证可用,它立即返回。

它阻止如果许可证不可用。线程在等待许可证可用时可能中断。

Semaphore类的其他方法允许您一次性获取一个或多个许可证。要释放许可证,请使用release()方法。

以下代码显示了一个Restaurant类,它使用信号量来控制对表的访问。

import java.util.Random;import java.util.concurrent.Semaphore;class Restaurant {  private Semaphore tables;  public Restaurant(int tablesCount) {
   this.tables = new Semaphore(tablesCount);
 }  public void getTable(int customerID) {    try {
     System.out.println("Customer  #" + customerID
         + "  is trying  to  get  a  table.");
     tables.acquire();
     System.out.println("Customer #" + customerID + "  got  a  table.");
   } catch (InterruptedException e) {
     e.printStackTrace();
   }
 }  public void returnTable(int customerID) {
   System.out.println("Customer #" + customerID + "  returned a  table.");
   tables.release();
 }
}class RestaurantCustomer extends Thread {  private Restaurant r;  private int customerID;  private static final Random random = new Random();  public RestaurantCustomer(Restaurant r, int customerID) {
   this.r = r;
   this.customerID = customerID;
 }  public void run() {
   r.getTable(this.customerID); // Get a table    try {      int eatingTime = random.nextInt(30) + 1;
     System.out.println("Customer #" + this.customerID
         + "  will eat for " + eatingTime + "  seconds.");
     Thread.sleep(eatingTime * 1000);
     System.out.println("Customer #" + this.customerID
         + "  is done  eating.");
   } catch (InterruptedException e) {
     e.printStackTrace();
   } finally {
     r.returnTable(this.customerID);
   }
 }
}public class Main{  public static void main(String[] args) {
   Restaurant restaurant = new Restaurant(2);    for (int i = 1; i <= 5; i++) {
     RestaurantCustomer c = new RestaurantCustomer(restaurant, i);
     c.start();
   }
 }
}

上面的代码生成以下结果。

Java同步器中的信号量.png

更多Java资讯关注网站动态,或者来惠州北大青鸟新方舟校区了解一下。

标签:惠州计算机JAVA软件开发惠州计算机Java软件开发惠州计算机JAVA培训惠州计算机JAVA软件开发学校惠州计算机Java软件开发培训JAVAJava软件开发北大青鸟IT计算机学校北大青鸟IT软件学校北大青鸟IT学校


Java技术排行
标签列表
网站分类
文章归档
最近发表