一:信号量的编程模型

 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多线程:并发包中的信号量和计数栓的编程模型的更多相关文章

  1. Java 多线程查找文件中的内容

    学过了操作系统,突然不知道多线程有什么用了. 看了一下百度,发现多线程,可以提升系统利用率 在系统进行IO操作的时候,CPU可以处理一些其他的东西,等IO读取到内存后,CPU再处理之前的操作. 总之可 ...

  2. java多线程向数据库中加载数据

    读取本地文件,每行为一条记录,文件大小550M,200万条数据.先将文件读取的内存中,再开启6个线程连接postgresql不同coordinator端口导入数据.代码如下: import java. ...

  3. java 多线程 2 Thread中start()和run()的区别

  4. Java多线程Socket在控制台输出的多人聊天室编程

    服务器端代码 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java ...

  5. Java并发包中Semaphore的工作原理、源码分析及使用示例

    1. 信号量Semaphore的介绍 我们以一个停车场运作为例来说明信号量的作用.假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦.以后 ...

  6. Java多线程并发工具类-信号量Semaphore对象讲解

    Java多线程并发工具类-Semaphore对象讲解 通过前面的学习,我们已经知道了Java多线程并发场景中使用比较多的两个工具类:做加法的CycliBarrier对象以及做减法的CountDownL ...

  7. Java多线程(四)java中的Sleep方法

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  8. Java多线程中对CountDownLatch的使用

    CountDownLatch是一个非常实用的多线程控制工具类,称之为“倒计时器”,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.用给定的计数初始化CountDownLatch,其含义 ...

  9. Java多线程系列——从菜鸟到入门

    持续更新系列. 参考自Java多线程系列目录(共43篇).<Java并发编程实战>.<实战Java高并发程序设计>.<Java并发编程的艺术>. 基础 Java多线 ...

随机推荐

  1. 黑客界大拿tombkeeper文章:怎么学好技术成为技术大拿(题目我自拟的)

    这两天论坛上又有人开始抱怨世风日下,大家都现实了,都不开放了,不交流了.对这种“月经贴”,我基本上已经习惯了,不过因为吃了粉皮炖鸡,心情比较好,于是就说了两句. 三四年前,当时我对人性的看法还不像现在 ...

  2. flash 和 第三方程序交互

    一.flash 端 修改 1.flash cs6  修改脚本 为as3 2.修改 按钮 实例 名 (不是sprite列表中的名字  实例名称 和这个名字 是2个) 3.时间轴上 添加代码 当前选择 A ...

  3. JVM-JDK命令行工具

    JDK命令行工具 当我们进入JDK的安装目录里面的/bin目录,会发现有很多小工具,有我们熟悉的也经常用的java,javac,也有很多我们不怎么用到很陌生的工具.下面看看哪些平时不怎么用到的工具吧. ...

  4. iOS 网络判定

    由于流量精灵需要在 蜂窝数据或者3G 环境下进行流量监控因此需要判定3G 环境 将 SystemConfiguration.framework 添加进工程: 引入头文件 #import <Sys ...

  5. 打造高质量Android应用:Android开发必知的50个诀窍

    打造高质量Android应用:Android开发必知的50个诀窍

  6. 获取一个 app 的 URL Scheme 的方法:

    获取一个 app 的 URL Scheme 的方法: 上这个网站 URL Schemes 查一下相应的 app 的 URL Scheme 是否有被收录 第一种方法没找到的话,把相应的 app 的 ip ...

  7. (转)js的左右滑动触屏事件

    原文:http://blog.sina.com.cn/s/blog_6a0a183f0100zsfk.html (2012-01-20 08:55:53) 转载▼ 标签: 移动设备 触屏事件 杂谈 分 ...

  8. postgreSQL初步使用总结

    一.安装 postgreSQL安装完成后会默认生成一个名为postgres的用户和一个名为postgres的数据库.可以使用自带的psql.exe工具来登录.其帮助信息如下 连接到本地的postgre ...

  9. linux上安装hadoop

    机器准备 物理机器 总 共4台,想配置基于物理机的hadoop集群中包括 4 个 节点: 1 个 Master , 3 个 Salve , 节点之间局域网连接,可以相互 ping 通Ip分布 为192 ...

  10. HDU 1044

    http://acm.hdu.edu.cn/showproblem.php?pid=1044 代码题,没什么好说的,先预处理出两点间距离,然后dfs搜一下找最大值 #include <iostr ...