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多线 ...
随机推荐
- 记录一些容易忘记的属性 -- UIButton
//设置按钮文字字体(这个只在自定义button时有效) btn1.titleLabel.font = [UIFont systemFontOfSize:30]; showsTouchWhenH ...
- ODI 12.1.3发布,提升支持大数据的能力
此次发布的ODI新版本,目的是更好的支持当前市场上的大数据平台. 大数据基因在不改变ODI工作效率的情况下,ODI增加了越来越多的数据源集成能力.ODI是在Oracle平台上标准的E-LT工具,事实上 ...
- jQuery 对dom的操作
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 2013年7月份第1周51Aspx源码发布详情
启睿网络信息服务器实例源码 2013-7-5 [ VS2005 ]功能介绍:睿网络信息服务器,QiRui Net Information Services简称QRNIS,该软件前身系KCIS.当前版 ...
- IOS中nil/Nil/NULL的区别
类与对象的概念 类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性)和动态属性(方法). 对象是类的一个实例,是一个具体的事物. 类与对象是抽象与具体的关系. 类其实就是一种数据 ...
- linux添加动态库搜索路径
在有时运行程序出现动态库找不着的问题,而明明装了的.这时候可能是没有将相应的路径添加到系统中去. 具体说:cd /etc/ld.so.conf.d/ 可以发现里面有一堆*.conf的文件 我们要做的就 ...
- nosql(1)---radis
Radis是一个key-value数据库,它会将key放入内存中,value放在硬盘上. 可以将数据持久化存储到磁盘. 内置的主从复制: master server和slave server之间有内 ...
- javascript笔记1-基本概念
关键字: 变量: function test(){ message = 'hi'; //不加var,表示全局变量:加var,表示局部变量 } 数据类型: 总共有五种基本数据类型:Undefined.N ...
- eclipse GIT使用
新建工程(要和GIT上同名,同类型)->右键->team->add to index->commit->更新config文件->remote: fetch from ...
- ACE - 代码层次及Socket封装
原文出自http://www.cnblogs.com/binchen-china,禁止转载. ACE源码约10万行,是c++中非常大的一个网络编程代码库,包含了网络编程的边边角角.在实际使用时,并不是 ...