A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 汤密奕 初级黑马   /  2012-7-9 00:56  /  1485 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 汤密奕 于 2012-7-10 23:19 编辑

class Resource
{
        private String name;
        private int conut;
        private boolean flag = false;
        public synchronized void set(String name)
        {

                try {
                        Thread.sleep(500);
                } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                }
                while(flag)
                {
                        try {
                                this.wait();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
                this.name = name+conut++;
                System.out.println(Thread.currentThread().getName()+":生产了"+this.name);
                flag = true;
                this.notifyAll();
        }
        
        public synchronized void out()
        {
                try {
                        Thread.sleep(500);
                } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                }
                while(!flag)
                {
                        try {
                                this.wait();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
                System.out.println(Thread.currentThread().getName()+":消费了"+this.name);
                flag = false;
                this.notifyAll();
        }
        
}

class Producer implements Runnable
{
        private Resource r;
        Producer(Resource r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                {
                        r.set("商品");
                }
        }
}

class Consumer implements Runnable
{
        private Resource r;
        Consumer(Resource r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                        r.out();
        }
}


public class ProducerConsumer {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Resource r = new Resource();
                Producer p = new Producer(r);
                Consumer c = new Consumer(r);
               
                Thread t1 = new Thread(p);
                Thread t2 = new Thread(p);
                Thread t3 = new Thread(c);
                Thread t4 = new Thread(c);
               
                t1.start();
                t2.start();
                t3.start();
                t4.start();
               

        }

}

现在我想当生产完第10个商品并将其消费掉,即当控制台打印出“Thread-x:消费了商品10”,就让整个程序终止,要怎么弄?

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

5 个回复

倒序浏览
你的问题提的太早了,继续看视频,生产者,消费者下面就讲如何停止线程了
回复 使用道具 举报
class Resource
{
        private String name;
        private int conut;
        private boolean flag = false;
        public synchronized void set(String name)
        {

                try {
                        Thread.sleep(500);
                } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                }
                while(flag)
                {
                        try {
                                this.wait();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
                this.name = name+conut++;
                System.out.println(Thread.currentThread().getName()+":生产了"+this.name);
                flag = true;
                this.notifyAll();
        }
        
        public synchronized void out()
        {
                try {
                        Thread.sleep(500);
                } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                }
                while(!flag)
                {
                        try {
                                this.wait();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
                               
                System.out.println(Thread.currentThread().getName()+":消费了"+this.name);
        if(this.name.equals("商品10"))
        System.exit(0);
//只要在这里加上红色的两句语句就可以了               
                flag = false;
                this.notifyAll();
        }
        
}

class Producer implements Runnable
{
        private Resource r;
        Producer(Resource r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                {
                        r.set("商品");
                }
        }
}

class Consumer implements Runnable
{
        private Resource r;
        Consumer(Resource r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                        r.out();
        }
}


public class ProducerConsumer {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Resource r = new Resource();
                Producer p = new Producer(r);
                Consumer c = new Consumer(r);
               
                Thread t1 = new Thread(p);
                Thread t2 = new Thread(p);
                Thread t3 = new Thread(c);
                Thread t4 = new Thread(c);
               
                t1.start();
                t2.start();
                t3.start();
                t4.start();
               

        }

}

评分

参与人数 1黑马币 +30 收起 理由
刘笑 + 30 赞一个!

查看全部评分

回复 使用道具 举报
achilles 发表于 2012-7-9 12:51
class Resource
{
        private String name;

呵呵,谢谢,一直想着怎么停止线程,糊涂了。。。
回复 使用道具 举报
我晕  看不懂啊  都这么强悍!
回复 使用道具 举报
汤密奕 发表于 2012-7-9 13:04
呵呵,谢谢,一直想着怎么停止线程,糊涂了。。。

呵呵 学习过程遇到问题很正常 互相帮助而已
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马