JDK5.0 特性-线程 Condition
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291471.html
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** *有时候线程取得lock后需要在一定条件下才能做某些工作,比如经典的Producer和Consumer问题 *在Java 5.0以前,这种功能是由Object类的wait(),notify()和notifyAll()等方法实现的 *在5.0里面,这些功能集中到了Condition这个接口实现 */ /** * 使用Condition的关键技术点如下: * 1.通过Lock的newCondition方法创建Condition的对象 * 2.Condition的await方法使当前线程进入等待状态,并且释放它占据的Lock,直到有其他的线程唤醒当前线程时,重新占有Lock. * 3.Condition的signal方法唤醒其他正在等待该Condition的线程. */ public class ConditionTest { /** * 篮子程序,这里为了简化问题,篮子中最多只能有一个苹果 * Consumer必须在篮子里有苹果的时候才能吃苹果,否则它必须暂时放弃对篮子的锁定 * 等到Producer往篮子里放了苹果后再去拿来吃。 * 否则它也需要暂时解锁等Comsumer把苹果吃了才能往篮子里放苹果。 */ public static class Basket{ //锁 Lock lock = new ReentrantLock(); //根据锁产生Condition对象 Condition produced = lock.newCondition(); Condition consumed = lock.newCondition(); //篮子里的苹果数,最多为1 int num = 0; //生产苹果,往篮子里放 public void produce() throws InterruptedException{ //获得锁 lock.lock(); System.out.println("Producer get a lock..."); try{ //判断是否满足生产条件 while(num == 1){ //如果有苹果,则不生产,放弃锁,进入睡眠 //等待消费者消费 System.out.println("Producer sleep..."); consumed.await(); System.out.println("Producer awaked..."); } //生产苹果 Thread.sleep(500); System.out.println("Producer produced an Apple."); num = 1; //通知等待produced Condition的线程 produced.signal(); }finally{ lock.unlock(); } } //消费苹果,从篮子里取 public void consume() throws InterruptedException{ //获得锁 lock.lock(); System.out.println("Consumer get a lock..."); try{ //判断是否满足消费条件 while(num == 0){ //如果没有苹果,无法消费,则放弃锁,进入睡眠 //等待生产者生产苹果 System.out.println("Consumer sleep..."); produced.await(); System.out.println("Consumer awaked..."); } //吃苹果 Thread.sleep(500); System.out.println("Consumer consumed an Apple."); num = 0; //发信号唤醒某个等待consumed Condition的线程 consumed.signal(); } finally { lock.unlock(); } } } //测试Basket程序 public static void testBasket() throws Exception{ final Basket basket = new Basket(); //定义一个producer Runnable producer = new Runnable(){ public void run() { try{ basket.produce(); }catch(InterruptedException ex){ ex.printStackTrace(); } } }; //定义一个consumer Runnable consumer = new Runnable(){ public void run(){ try{ basket.consume(); }catch(InterruptedException ex){ ex.printStackTrace(); } } }; //各生产3个consumer和producer ExecutorService service = Executors.newCachedThreadPool(); for(int i = 0; i <3; i++){ service.submit(producer); } for(int i = 0;i<3;i++){ service.submit(consumer); } service.shutdown(); } public static void main(String... args)throws Exception{ ConditionTest.testBasket(); } }
JDK5.0 特性-线程 Condition的更多相关文章
- JDK5.0特性-线程 Callable和Future
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291466.html import java.util.concurrent.Callable ...
- JDK5.0 特性线程 同步装置之CountDownLatch 同步装置之CyclicBarrier 线程 BlockingQueue
来自:http://www.cnblogs.com/taven/category/475298.html import java.util.concurrent.CountDownLatch; imp ...
- JDK5.0 特性-线程锁Lock
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291470.html import java.util.concurrent.Executor ...
- JDK5.0 特性-线程同步装置之Semaphore
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291474.html import java.util.ArrayList; import j ...
- JDK5.0 特性-线程任务执行架构 ScheduledExecutorService
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291469.html import java.util.concurrent.Callable ...
- JDK5.0 特性 监控与管理虚拟机
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291465.html import java.lang.management.ClassLoa ...
- JDK5.0特性,使用ProcessBuilder执行本地命令
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IO ...
- 集合框架-工具类-JDK5.0特性-函数可变参数
1 package cn.itcast.p4.news.demo; 2 3 public class ParamterDemo { 4 5 public static void main(String ...
- 集合框架-工具类-JDK5.0特性-ForEach循环
1 package cn.itcast.p4.news.demo; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 impo ...
随机推荐
- ASP.NET MVC:Form Authentication 相关的学习资源
看完此图就懂了 看完下面文章必须精通 Form authentication and authorization in ASP.NET Explained: Forms Authentication ...
- 分布式系统唯一ID生成方案汇总 转
系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见 ...
- algid parse error, not a sequence错误
主要使用由于没有对使用openssl生成的公私密钥对进行pkcs8编码,导致程序无法识别参考支付宝.项目用用到RSA加密用openssl生成了一个公私密钥对,在对加密字符串进行数字签名的时候,程序一直 ...
- 百度搜索推出惊雷算法严厉打击刷点击作弊行为-SEO公司分享
百度搜索推出惊雷算法严厉打击刷点击作弊行为 2017年11月20日凌晨,百度搜索引擎发布更新惊雷算法旨在打击刷点击作弊行为. 下面是惊雷算法相关新闻报道: 百度搜索将于11月底推出惊雷算法,严厉打击通 ...
- C# 泛型的简单理解(安全、集合、方法、约束、继承)
前言 泛型允许你在编译时实现类型安全.它们允许你创建一个数据结构而不限于一特定的数据类型.然而,当使用该数据结构时,编译器保证它使用的类型与类型安全是相一致的.泛型提供了类型安全,但是没有造成任何性能 ...
- 修复android下webView控件的总结
游戏中有一个收集玩家问题反馈的网页,很早之前就有同事反映说android在游戏无法上传附件,在浏览器中是可以正常使用的.最近能腾出手来的时候,就仔细看了一下这个问题,发现很里藏着不少问题,这里一一记录 ...
- 洛谷 p1352 没有上司的舞会 题解
P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员 ...
- OpenCV教程(48) 特征值匹配
OpenCV中通过下面的代码,可以匹配两幅的图像的特征值. // Read input images cv::Mat image1= cv::imread("../church0 ...
- 很不错的python 机器学习博客
http://www.cuijiahua.com/resource.html 曾看过的书,感觉一些很有用的学习资料,推荐给大家! Python基础: 网络教程推荐: 系统学习python3可以看廖雪峰 ...
- 自定义View 可清除内容、设置图标、下划线的输入框 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...