`

JDK5.0新特性系列---11.4线程 Condition

 
阅读更多

 

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();
    }
}
分享到:
评论

相关推荐

    JDK 5.0.zip

    压缩包中的文件`jdk-1_5_0-windows-i586.exe`是Windows平台上的JDK 5.0安装程序,适用于32位系统。安装这个版本的JDK后,开发者可以体验到上述的新特性,并在项目中使用它们来提升代码质量。需要注意的是,随着Java...

    JDK5.0_下载-安装-配置

    JDK5.0是Oracle公司于2004年发布的一个重要版本,引入了许多新特性,对Java编程语言做了重大改进,提升了开发效率。要下载JDK5.0,首先访问Oracle的官方网站历史版本页面,或者通过互联网上的存档链接找到该版本的...

    jdk5.0新特性

    ### JDK 5.0新特性详解 #### 一、自动装箱与自动拆箱 在JDK 5.0中,引入了一个非常实用的功能——自动装箱和自动拆箱,这极大地方便了开发者在处理基本数据类型和它们对应的封装类之间的转换。以前,我们可能需要...

    part 10 [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    JDK5.0新特性 常量 、枚举、 for each、反射

    在Java开发领域,JDK 5.0是一个重要的里程碑,引入了多项显著的新特性,极大地提升了编程效率和代码质量。本文将深入探讨其中的四个关键特性:常量、枚举、for each循环(也称为增强型for循环)以及反射。 首先,让...

    jdk-8u311-windows-x64.exe

    jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u...

    JDK5.0 新特性

    在JDK 5.0中,Java引入了一系列重要的新特性,极大地提升了开发效率和代码的可读性。这些新特性包括自动包装和解包、增强的for循环、可变参数方法、printf风格的格式化输出、枚举类型以及静态导入等。 首先,自动...

    part6 [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    part5 [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    浪曦 - JDK5.0新特性.part3

    浪曦 - JDK5.0新特性.part3

    浪曦 - JDK5.0新特性.part2

    浪曦 - JDK5.0新特性.part2

    JDK5.0新特性(3)——枚举

    在Java编程语言中,JDK 5.0的发布带来了一系列重要的新特性,极大地提升了开发效率和代码质量。其中,枚举(Enum)是引入的一个关键特性,它为表示固定集合中的常量提供了强大而安全的支持。这篇博客将深入探讨JDK ...

    浪曦 - JDK5.0新特性.part5.rar

    浪曦 - JDK5.0新特性.part5.rar

    part3 [浪曦][原创]JDK5.0新特性[风中叶老师主讲

    [浪曦][原创]JDK5.0新特性[风中叶老师主讲[浪曦][原创]JDK5.0新特性[风中叶老师主讲[浪曦][原创]JDK5.0新特性[风中叶老师主讲

    浪曦 - JDK5.0新特性.part4.rar

    浪曦 - JDK5.0新特性.part4.rar

    part1 [浪曦][原创]JDK5.0新特性[风中叶老师主讲]

    [浪曦][原创]JDK5.0新特性[风中叶老师主讲][浪曦][原创]JDK5.0新特性[风中叶老师主讲][浪曦][原创]JDK5.0新特性[风中叶老师主讲]

    jdk-8u172-windows-x64.exe、jdk-8u251-windows-x64.exe、jdk-14.0.1_windows-x64_bin.e

    本话题涉及三个不同版本的JDK:jdk-8u172-windows-x64.exe、jdk-8u251-windows-x64.exe以及jdk-14.0.1_windows-x64_bin.exe,分别对应Java 8的两个更新版本和Java 14的一个版本。 首先,让我们详细了解一下Java 8。...

    JDK5.0新特性 反射、枚举.rar

    在`JDK5.0新特性 (2)——反射.doc`中,你可能会学习到如何使用`java.lang.Class`对象来获取类信息,以及如何使用`java.lang.reflect`包中的`Constructor`、`Method`和`Field`类来操作类的构造器、方法和字段。...

    jdk-8u171-windows

    jdk-8u171下载。 JDK介绍 JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。 SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。 EE(J2EE),enterprise ...

    part8 [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

Global site tag (gtag.js) - Google Analytics