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 ...
随机推荐
- 架构:The Onion Architecture : part 1(洋葱架构:第一篇)(转载)
原文地址:http://jeffreypalermo.com/blog/the-onion-architecture-part-1/. I've spoken several times about ...
- Java删除List和Set集合中元素
今天在做项目时,需要删除List和Set中的某些元素,当时使用边遍历,边删除的方法,却报了以下异常: ConcurrentModificationException 为了以后不忘记,使用烂笔头把它记录 ...
- 绝望的主妇第八季/Desperate Housewives迅雷下载
绝望的主妇 第七季 Desperate Housewives Season 8(2011) 本季看点:曾经在<主妇>中有过重要演出的达娜·德拉尼(Dana Delany), 凯尔·麦克拉克 ...
- Node.js + Express 构建的订餐系统
Node.js的版本 - v0.8.12 Express的版本 – v3.3.3 (安装 $ npm install -g express) 系统的登录逻辑是:获取用户名 + 密码,向内网RTX服务 ...
- .Net AppDomain详解(一)
AppDomain是CLR的运行单元,它可以加载Assembly.创建对象以及执行程序.AppDomain是CLR实现代码隔离的基本机制. 每一个AppDomain可以单独运行.停止:每个AppDom ...
- HTML5 <Audio>标签API整理(三)
一.浏览器支持 Internet Explorer 9+, Firefox, Opera, Chrome, 和 Safari 都支持 <audio> 元素. 注意: Internet Ex ...
- [转]PHP与Shell交互
From : http://blog.csdn.net/houqd2012/article/details/8219199 最近想使用PHP与Sheel进行交互.PHP控制显示和高层的逻辑结构.She ...
- cesium js学习一加载三维模型【转】
http://blog.csdn.net/tangyajun_168/article/details/50936698 最近项目中用到室外三维模型与室内三维地图交互,室外三维模型的加载我们采用了ces ...
- 8 个基于 Lucene 的开源搜索引擎推荐
Lucene是一种功能强大且被广泛使用的搜索引擎,以下列出了8种基于Lucene的搜索引擎,你可以想象它们有多么强大. 1. Apache Solr Solr 是一个高性能,采用Java5开发,基于L ...
- [leetcode]Candy @ Python
原题地址:https://oj.leetcode.com/problems/candy/ 题意: There are N children standing in a line. Each child ...