java多线程:并发包中的信号量和计数栓的编程模型
一:信号量的编程模型
package com.yeepay.sxf.test.atomic.test; import java.util.concurrent.Semaphore; /**
* 测试信号量
* 相当于有一把可以控制并发量的锁。
* 例如银行柜台,只有两个窗口。但三个人做业务,只允许同时有两个人能进行做业务
*
* 多线程
* @author sxf
*
*/
public class TestSemaphore { public static void main(String[] args) {
//声明两个信号量
Semaphore semaphore=new Semaphore(2);
//有三个线程抢许可证(信号量)做业务
Person person1=new Person("sxf", semaphore);
Person person2=new Person("sxs", semaphore);
Person person3=new Person("ssy", semaphore);
//启动这三个线程工作(同时允许的并发量为2)
person1.start();
person2.start();
person3.start();
} } class Person extends Thread{ /**
* 信号量(许可证)
*/
private Semaphore semaphore;
/**
* 当前线程的名字
*/
private String cname; public Person(String cname,Semaphore semaphore) {
this.cname=cname;
this.semaphore=semaphore;
} @Override
public void run() {
System.out.println("Person.run(==>)"+getCname()+" is wating........");
try {
//获取许可证
semaphore.acquire();
System.out.println("Person.run()"+getCname()+" is doneing.......");
Thread.sleep(3000);
System.out.println("Person.run(==>)"+getCname()+" is service done......");
//释放许可证
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public Semaphore getSemaphore() {
return semaphore;
} public void setSemaphore(Semaphore semaphore) {
this.semaphore = semaphore;
} public String getCname() {
return cname;
} public void setCname(String cname) {
this.cname = cname;
} }
一:计数栓的编程模型
package com.yeepay.sxf.test.atomic.test; import java.util.concurrent.CountDownLatch;
/**
* 测试记数栓
*
* 当记数栓定义的多个事件发生时候,才能执行任务
* @author sxf
*
*/
public class TestCountDowanLatch { public static void main(String[] args) throws InterruptedException {
//定义三个事件的计数栓
CountDownLatch countDownLatch=new CountDownLatch(3);
//定义任务线程
Runer runer=new Runer("sxf", countDownLatch);
Runer runer2=new Runer("sxs", countDownLatch);
Runer runer3=new Runer("sxy", countDownLatch); //启动任务线程
runer.start();
runer2.start();
runer3.start(); //住线程监控特定事件的发生次数
for(int i=0;i<3;i++){
Thread.sleep(3000);
System.out.println("TestCountDowanLatch.main(事件发生第【"+(i+1)+"】次");
if(i==2){
System.out.println("TestCountDowanLatch.main(事件发生次数已经达标允许线程执行任务)");
countDownLatch.countDown();
} } }
} class Runer extends Thread{
/**
* 计数栓
*/
private CountDownLatch countDownLatch; private String cname; public Runer(String cname,CountDownLatch countDownLatch) {
this.cname=cname;
this.countDownLatch=countDownLatch;
} @Override
public void run() {
try {
System.out.println("Runer.run()"+getName()+" is await.............");
countDownLatch.await();
System.out.println("Runer.run()"+getName()+" is doneing...........cname"); } catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public CountDownLatch getCountDownLatch() {
return countDownLatch;
} public void setCountDownLatch(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
} public String getCname() {
return cname;
} public void setCname(String cname) {
this.cname = cname;
} }
java多线程:并发包中的信号量和计数栓的编程模型的更多相关文章
- Java 多线程查找文件中的内容
学过了操作系统,突然不知道多线程有什么用了. 看了一下百度,发现多线程,可以提升系统利用率 在系统进行IO操作的时候,CPU可以处理一些其他的东西,等IO读取到内存后,CPU再处理之前的操作. 总之可 ...
- java多线程向数据库中加载数据
读取本地文件,每行为一条记录,文件大小550M,200万条数据.先将文件读取的内存中,再开启6个线程连接postgresql不同coordinator端口导入数据.代码如下: import java. ...
- java 多线程 2 Thread中start()和run()的区别
- Java多线程Socket在控制台输出的多人聊天室编程
服务器端代码 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java ...
- Java并发包中Semaphore的工作原理、源码分析及使用示例
1. 信号量Semaphore的介绍 我们以一个停车场运作为例来说明信号量的作用.假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦.以后 ...
- Java多线程并发工具类-信号量Semaphore对象讲解
Java多线程并发工具类-Semaphore对象讲解 通过前面的学习,我们已经知道了Java多线程并发场景中使用比较多的两个工具类:做加法的CycliBarrier对象以及做减法的CountDownL ...
- Java多线程(四)java中的Sleep方法
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- Java多线程中对CountDownLatch的使用
CountDownLatch是一个非常实用的多线程控制工具类,称之为“倒计时器”,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.用给定的计数初始化CountDownLatch,其含义 ...
- Java多线程系列——从菜鸟到入门
持续更新系列. 参考自Java多线程系列目录(共43篇).<Java并发编程实战>.<实战Java高并发程序设计>.<Java并发编程的艺术>. 基础 Java多线 ...
随机推荐
- NSURLSession使用实战教程
我的前面两篇文章介绍了NSURLSession套件的使用和NSURLSession套件的主要类.今天我们使用NSURLSession来完成一个小的应用程序.在实战之前,我先补充一点,为什么苹果会主推N ...
- python练习——最长的递减子序列
题目: 求一个数组的最长递减子序列比 , 如随机生成一组序列 {8,9,6,3,6,2,3,4} 求得最长递减序列 {9,8,6,4,3,2} list=[3,3,3,3,6,2,3,4] //冒 ...
- js 弹出div窗口 可移动 可关闭 (转)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- RelativeLayout相对布局中拖放控件的办法
相对布局中拖了一个控件以后,要拖放第二个空间,死活拖不进去.仔细查看了鼠标的状况,发现要把第二个控件拖到第一个控件的周围,才能成功.果然是相对布局.
- HTML--10Jquery
在<网页制作Dreamweaver(悬浮动态分层导航)>中,运用到了jQuery的技术,轻松实现了菜单的下拉.显示.隐藏的效果,不必再用样式表一点点地修改,省去了很多麻烦,那么jQuery ...
- Non-constant Fields in Case Labels
Non-constant Fields in Case Labels in android library project http://tools.android.com/tips/non-cons ...
- Jul_31 PYTHON REGULAR EXPRESSIONS
1.Special Symbols and Characters 1.1 single regex 1 . ,Match any character(except \n) ^ ,Match start ...
- HDU 1693 Eat the Trees
第一道(可能也是最后一道)插头dp.... 总算是领略了它的魅力... #include<iostream> #include<cstdio> #include<cstr ...
- python基础之模块之os模块
os模块 os模块的作用: os,语义为操作系统,所以肯定就是操作系统相关的功能了,可以处理文件和目录这些我们日常手动需要做的操作,就比如说:显示当前目录下所有文件/删除某个文件/获取文件大小…… 另 ...
- 省赛13 Alice and Bob(二进制,找规律)
题意:多项式相乘,(a0x+1)(a1x^2+1)(a2x^4+1),问x的m次方的系数是多少,当时没做出来,搜的某大神的博客,好理解. 思路:多列几个式子就能明白规律了: (a0x+1)(a1x^2 ...