黑马程序员技术交流社区

标题: 两个线程间的等待唤醒机制:一个生产者、一个消费者 [打印本页]

作者: 史世锋    时间: 2015-9-17 23:04
标题: 两个线程间的等待唤醒机制:一个生产者、一个消费者
package com.itheima;

//定义一个商品类
class Goods2
{
        String name;
        String use;
        //定义一个标识符,用来判断商品是否已经生产
        boolean flag = false;
}

//定义生产者类,用来生产商品
class Producer2 implements Runnable
{
        Goods2 good;
        Producer2(Goods2 good)
        {
                this.good = good;
        }
        @Override
        public void run()
        {
                boolean flag = true;
                while(true)
                {
                        synchronized(Goods2.class)
                        {
                                //如果商品已经生产,就让生产者等待
                                if(good.flag)
                                        try
                                        {
                                                Goods2.class.wait();
                                        } catch (InterruptedException e)
                                        {
                                                // TODO 自动生成的 catch 块
                                                e.printStackTrace();
                                        }
                                if(flag)
                                {
                                        //生产者生产一个篮球
                                        good.name = "basketball";
                                        good.use = "play";
                                        flag = false;
                                }
                                else
                                {
                                        //生产者生产一个面包
                                        good.name = "面包";
                                        good.use = "吃的";
                                        flag = true;
                                }
                                //商品被生产后,修改标识符,并唤醒消费者
                                good.flag = true;
                                Goods2.class.notifyAll();
                        }
                       
                }
        }
}

//定义消费者类,用来消费商品
class Consumer2 implements Runnable
{
        Goods2 good;
        Consumer2(Goods2 good)
        {
                this.good = good;
        }
        @Override
        public void run()
        {
                while(true)
                {
                        synchronized(Goods2.class)
                        {
                                //如果没有商品,消费者就等待
                                if(!good.flag)
                                        try
                                        {
                                                Goods2.class.wait();
                                        } catch (InterruptedException e)
                                        {
                                                // TODO 自动生成的 catch 块
                                                e.printStackTrace();
                                        }
                                //消费者消费商品
                                System.out.println(good.name + "---" + good.use);
                               
                                //消费商品后,修改标识符,并唤醒生产者
                                good.flag = false;
                                Goods2.class.notifyAll();
                        }
                       
                }
               
        }
}
public class Test029
{

        /**
         * @param args
         */
        public static void main(String[] args)
        {
                Goods2 good = new Goods2();
                Producer2 producer = new Producer2(good);
                Consumer2 consumer = new Consumer2(good);
                new Thread(producer).start();
                new Thread(consumer).start();
        }

}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2