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 ...
随机推荐
- nginx网站攻击防护
1.上上个月架构全部迁移上云以后,总的来说比较稳定,业务量也上来,可爱的坏人也来了,7X24小时不停恶意攻击我的网站,第一次收到报警是网站流入流量1分钟以内连续3次超过1000000bps,换算下1M ...
- 虚拟化(三):vsphere套件的安装注意及使用
虚拟化(一):虚拟化及vmware产品介绍 虚拟化(二):虚拟化及vmware workstation产品使用 虚拟化(五):vsphere高可用群集与容错 vsphere套件里面基本的组件有e ...
- 罪恶黑名单第四季/全集The Blacklist迅雷下载
英文全名The Blacklist,第1季(2016)NBC.本季看点:<罪恶黑名单>我们知道:剧情紧接第三季结尾,每个人——Liz,Red以及特别行动组的其他人——似乎都有许多故事可说: ...
- 调用人人网API
大致步骤与上篇调用新浪微博API类似.只是感觉新浪微博的做的更好一些,人人网的非常多要手动操作 与新浪微博类似,先在人人网开放平台http://dev.renren.com/注冊站内应用, 把该填的填 ...
- information_schema系列十
information_schema系列十 1:INNODB_FT_CONFIG 这张表存的是全文索引的信息,查询前可以先通过以下语句查询一下开启全文索引的表: show variables li ...
- python的重试库tenacity用法以及类似库retry、requests实现
介绍 tenacity is an Apache 2.0 licensed general-purpose retrying library, written in Python, to simpli ...
- jQuery.data() 的实现方式,jQuery16018518865841457738的由来,jQuery后边一串数字的由来
原文地址: http://xxing22657-yahoo-com-cn.iteye.com/blog/1042440 jQuery.data() 的实现方式 jQuery.data() 的作用是为普 ...
- RV32A指令集
RV32A指令包括两类:AMO(atomic memory operation)指令,Load-Reserved/Store-Conditional指令 Category Fmt RV32I base ...
- xenapp 6.5 客户端插件第一次安装总是跳到官网
部署完xenapp6.5后,在没有安装插件的客户端登录时,会出现“下载客户端插件”界面 其实网上已经有很多解决方案,大同小已,只是不知道为什么不适合我安装的版本而已.我安装时最新的版本xenapp 6 ...
- [leetcode]Word Ladder II @ Python
[leetcode]Word Ladder II @ Python 原题地址:http://oj.leetcode.com/problems/word-ladder-ii/ 参考文献:http://b ...