爪哇 2博客
 爪哇 2博客

爪哇 信号量示例

 爪哇 信号量示例
在本教程中,我们将了解有关Java中的信号量的信息。
信号量是JDK 5中引入的java.util.concurrent包中的类。信号量基本上维护一组许可,因此主要有两种方法用于信号量。

  • 获得
  • 释放
Acquisition()方法用于获取许可,如果没有,则使用许可。许可数达到最大允许许可数,然后线程必须等待获取许可,该许可将通过调用release()方法由其他某个线程释放。

信号量通常用于限制访问资源的线程数。

实时示例:

  • 信号量可用于限制一次数据库连接的数量
  • 信号量也可以用于绑定任何集合。

例:

我们将创建一个BoundedArrayList类,一次只能包含5个元素。如果有任何线程想要向列表中添加更多元素,则该线程将不得不等待其他线程从列表中删除元素。
当我们向列表中添加元素时,我们将调用semaphore.acquire;当我们从列表中删除元素时,我们将调用semaphore.release。
创建一个名为BoundedArrayList的类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
组织 . Arpit . 爪哇 2blog.;
 
进口 爪哇 . 实用程序 .数组列表;
进口 爪哇 . 实用程序 .馆藏;
进口 爪哇 . 实用程序 . 清单 ;
进口 爪哇 . 实用程序 .同时.信号;
 
上市 BoundedArrayList {
 
私人的 最后 信号 信号;
私人的 清单 数组列表;
 
BoundedArrayList( 整型 限制 ) {
这个 .数组列表 = 馆藏.同步列表( 数组列表());
信号 = 信号( 限制 );
}
 
/ *
*将元素添加到列表中并调用semaphore.acquire方法
* * /
上市 布尔值 (T t) 抛出 InterruptedException {
布尔值 添加 = ;
信号. 获得 ();
尝试 {
添加 = 数组列表.(t);
返回 添加 ;
} 最后 {
如果 (! 添加 )
信号. 释放 ();
}
 
}
 
/ *
*从列表中删除元素并调用semaphore.release方法
* * /
上市 布尔值 去掉 (T t) {
布尔值 去掉了 = 数组列表. 去掉 (t);
如果 (去掉了)
信号. 释放 ();
返回 去掉了;
}
 
上市 虚空 去掉 ( 整型 指数 ) {
数组列表. 去掉 ( 指数 );
信号. 释放 ();
}
 
上市 清单 getArraylist() {
返回 数组列表;
}
 
上市 信号 getSemaphore() {
返回 信号;
}
}
 

创建一个主类BoundedArrayListMain.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
组织 . Arpit . 爪哇 2blog.;
 
上市 BoundedArrayListMain {
 
上市 静态的 虚空 主要 ([] args ) 抛出 InterruptedException {
 
   最后 BoundedArrayList BA = BoundedArrayList(5);
   可运行 可运行1 = 可运行 () {
 
   @覆写
   上市 虚空 () {
     尝试 {
     BA .( “约翰” );
     BA .( “马丁” );
     BA .( “亚当” );
     BA .(“王子”);
     BA .( “托德” );
     系统 .. 打印 (“可用许可证:”+ BA .getSemaphore().可用许可证());
     BA .("托尼");
     系统 .. 打印 (“最终名单:”+ BA .getArraylist());
    } 抓住 (InterruptedException ) {
 
    }
   }
  };
   可运行 运行2 = 可运行 () {
   @覆写
   上市 虚空 () {
     尝试 {
     系统 .. 打印 (“在删除元素之前:”+ BA .getArraylist());
     线 . 睡觉 (5000);
     BA . 去掉 ( “马丁” );
     BA . 去掉 ( “亚当” );
    } 抓住 (InterruptedException e) {
     e.printStackTrace();
    }
   }
  };
 
   线 t1 = 线 (可运行1);
   线 t2 = 线 (运行2);
  t1. 开始 ();
  t2. 开始 ();
}
 
}
 

当您运行上述程序时,将获得以下输出:

1
2
3
4
5
 
可用的 许可证 : 0
之前 清除 元素: [ 约翰 , 马丁 , 亚当 , 王子 , 托德 ]
最后 清单 : [ 约翰 , 王子 , 托德 , 托尼]
 

说明:

  • 我们创建了两个线程t1和t2。
  • t1和t2都共享公用列表参考ba。
  • 当t1将5个元素添加到列表中时,可用许可变为0。
  • 现在t1等待另一个线程删除元素,以便信号灯具有一些可用的许可。
  • 等待5秒钟后,另一个线程t2从列表中删除元素。
  • t2删除元素后,t1添加“Tony” to 清单 .

导入联系人

您可能还喜欢:

分享这个

作者

关注作者

相关文章

Comments

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


成为朋友

©2020 爪哇 2博客