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多线 ...
随机推荐
- SharePoint 2013 搜索体系结构
博客地址:http://blog.csdn.net/FoxDave 本文参考自微软官方的Chart,记录一下,算是自己对这部分知识的总结. Microsoft® SharePoint® Server ...
- 加载不同的nib文件
只需要实现nibName方法即可 另外还需在vc控制器初始化的时候不指定对应的nib文件名 -(NSString *)nibName { if(UI_USER_INTERFACE_IDIOM() == ...
- AudioQueue语音流 speex压缩 实时通讯 对讲机
参开 http://blog.csdn.net/liulina603/article/details/19029727 博客有多篇文章 http://blog.csdn.net/liulina6 ...
- 5月18日:top10面试算法-LRUcache的实现
问题描述: LRU算法:优先把那些最长时间没使用的对象置换掉.根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. JAVA实现: 测试: publ ...
- python中的namespace
python中的名称空间是名称(标识符)到对象的映射. 具体来说,python为模块.函数.类.对象保存一个字典(__dict__),里面就是重名称到对象的映射. 可以参看下面python程序的输出: ...
- 0911 Socket网络编程
1.实现ftp上传.下载功能 1.1 循环接收数据直到接收完毕 server端接收client发送的命令(比如说ifconfig),然后server端将命令执行结果反馈给客户端,这时候有个问题,ser ...
- iOS开发之吸附动画效果
步骤:1.使用singleviewapplication创建新的项目 2.在.h文件中创建两张图片的实例对象,并与相关的图片进行相连:创建一个UIDynamicAnimator实例对象 3.在.m文件 ...
- https 三次握手
1,客户端输入https网址,链接到server443端口: 2,服务器手中有一把钥匙和一个锁头,把锁头传递给客户端.数字证书既是公钥,又是锁头 3,客户端拿到锁头后,生成一个随机数,用锁头把随机数锁 ...
- Ztree实现带checkBox的下拉框
UI <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ArticleMove ...
- LeetCode Rectangle Area (技巧)
题意: 分别给出两个矩形的左下点的坐标和右上点的坐标,求他们覆盖的矩形面积? 思路: 不需要模拟,直接求重叠的部分的长宽就行了.问题是如果无重叠部分,注意将长/宽给置为0. class Solutio ...