JDK5.0 特性-线程 Condition
2014-07-14 13:57
375 查看
来自: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特性-线程 Callable和Future
- JDK5.0新特性系列---11.2线程 任务执行架构
- JDK5.0新特性系列---11.5.1线程 同步装置之Semaphore
- JDK5.0新特性系列---11.5.4线程 同步装置之Exchanger
- JDK1.5(JDK5.0) 新特性
- JDKjdk1.4、jdk5.0、JDK6.0、 JDK7.0 新特性
- 无法转向JDK 5.0?学习一款开放源代码工具如何帮助在旧版 JVM 上使用这些特性
- jdk5.0新特性
- 今天学习的内容dom4j编程、debug调试、JDK5.0新特性
- JDK 5.0 Concurrency Utilities 并发处理(2)Condition 条件变量
- Jdk5.0新特性
- JDK5.0新特性-自动装箱/拆箱
- JDK5.0新增特性
- JDK5.0新特性系列---7.使用ProcessBuilder执行本地命令
- JDK 5.0特性
- Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
- JDKjdk1.4、jdk5.0、JDK6.0、 JDK7.0、JDK8.0、JDK9.0(2016年发布) 新特性
- 枚举 JDK5.0的新特性之一
- 黑马程序员——JDK5.0新特性
- JDK5.0新特性-增强for循环