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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.util.concurrent.locks.*;
class  ProducerConsumerDeme2
{
        public static void main(String[] args)
        {
                Resource r =new Resource();

                Producer pro=new Producer(r);
                Consumer con=new Consumer(r);

                Thread t1= new Thread (pro);
                Thread t2 = new Thread (con);
                Thread t3= new Thread (pro);
                Thread t4 = new Thread (con);

                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}

class Resource
{
        private String name;
        private int count =1;
        private boolean flag= false;
        private Lock  lock= new ReentrantLock ();

        private Condition condition_pro= lock.newCondition();
        private Condition condition_con= lock.newCondition();


        public void set(String name) throws InterruptedException
        {
                lock.lock();
                try
                {
                        while(flag)
                                condition_pro.await();
                        this.name=name+"--"+count++;

                        System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
                        flag=true;
                        condition_con.signal();
                }
                finally
                {
                        lock.unlock();
                }
        }
        public  void out()throws InterruptedException
        {
                lock.lock();
                try
                {
                        while(!flag)
                                condition_con.await();
                        System.out.println((Thread.currentThread()).getName()+"...消费者........."+this.name);
                        flag =false;
                        condition_pro.signal();
                }
                finally
                {
                        lock.unlock();
                }

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

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


提示 是 下面。我这不是写了 throws InterruptedException 怎么还有这个错误。头大。。。。
ProducerConsumerDeme2.java:86: 未报告的异常 java.lang.InterruptedException;必须
对其进行捕捉或声明以便抛出
                                res.set("+商品+");
                                       ^
1 错误

10 个回复

倒序浏览
public void set(String name)

res.set("+商品+");
是不是参数不对
this.name=name+"--"+count++;
private int count =1;
回复 使用道具 举报
本帖最后由 邓海涛 于 2012-4-8 14:42 编辑

import java.util.concurrent.locks.*;
class  ProducerConsumerDeme2
{
        public static void main(String[] args)
        {
                Resource r =new Resource();

                Producer pro=new Producer(r);
                Consumer con=new Consumer(r);

                Thread t1= new Thread (pro);
                Thread t2 = new Thread (con);
                Thread t3= new Thread (pro);
                Thread t4 = new Thread (con);

                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}

class Resource
{
        private String name;
        private int count =1;
        private boolean flag= false;
        private Lock  lock= new ReentrantLock ();

        private Condition condition_pro= lock.newCondition();
        private Condition condition_con= lock.newCondition();


        public void set(String name) throws InterruptedException
        {
                lock.lock();
                try
                {
                        while(flag)
                                condition_pro.await();
                        this.name=name+"--"+count++;

                        System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
                        flag=true;
                        condition_con.signal();
                }
                finally
                {
                        lock.unlock();
                }
        }
        public  void out()throws InterruptedException
        {
                lock.lock();
                try
                {
                        while(!flag)
                                condition_con.await();
                        System.out.println((Thread.currentThread()).getName()+"...消费者........."+this.name);
                        flag =false;
                        condition_pro.signal();
                }
                finally
                {
                        lock.unlock();
                }

        }
}
class Producer implements Runnable
{
        private Resource res;
               
                Producer (Resource res)
                {
                        this.res=res;
                }
                public void run()
                {
                        while(true)
                        {
                             try{  
                                    res.set("+商品+");
                              catch(Exception e){
                                    e.printStackTrace() ;
                              }
                        }
                }
}

class  Consumer implements Runnable
{
        private Resource res;
               
                Consumer (Resource res)
                {
                        this.res=res;
                }
                public void run()
                {
                        while(true)
                        {
                              try{
                                      res.out();
                               }catch(Exception e){
                                     e.printStackTrace() ;
                               }
                        }
                }
}


朋友这样就可以了,是因为你没有对异常进行捕捉,所以才错误,你比较下代码吧,我对异常进行捕捉以后,可以正常运行了
回复 使用道具 举报
不能抛 那只能 try catch了啊~
回复 使用道具 举报


import java.util.concurrent.locks.*;
class  ProducerConsumerDeme2
{
        public static void main(String[] args)
        {
                Resource r =new Resource();

                Producer pro=new Producer(r);
                Consumer con=new Consumer(r);

                Thread t1= new Thread (pro);
                Thread t2 = new Thread (con);
                Thread t3= new Thread (pro);
                Thread t4 = new Thread (con);

                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}

class Resource
{
        private String name;
        private int count =1;
        private boolean flag= false;
        private Lock  lock= new ReentrantLock ();

        private Condition condition_pro= lock.newCondition();
        private Condition condition_con= lock.newCondition();


        public void set(String name) throws InterruptedException
        {
                lock.lock();
                try
                {
                        while(flag)
                                condition_pro.await();
                        this.name=name+"--"+count++;

                        System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
                        flag=true;
                        condition_con.signal();
                }
                finally
                {
                        lock.unlock();
                }
        }
        public  void out()throws InterruptedException
        {
                lock.lock();
                try
                {
                        while(!flag)
                                condition_con.await();
                        System.out.println((Thread.currentThread()).getName()+"...消费者........."+this.name);
                        flag =false;
                        condition_pro.signal();
                }
                finally
                {
                        lock.unlock();
                }

        }
}
class Producer implements Runnable
{
        private Resource res;
               
                Producer (Resource res)
                {
                        this.res=res;
                }
                public void run()
                {
                        while(true)
                        {
                                try {
                                                                        res.set("+商品+");
                                                                } catch (InterruptedException e) {
                                                                        // TODO Auto-generated catch block
                                                                        e.printStackTrace();
                                                                }
                        }
                }
}

class  Consumer implements Runnable
{
        private Resource res;
               
                Consumer (Resource res)
                {
                        this.res=res;
                }
                public void run()
                {
                        while(true)
                        {
                                try {
                                                                        res.out();
                                                                } catch (InterruptedException e) {
                                                                        // TODO Auto-generated catch block
                                                                        e.printStackTrace();
                                                                }
                        }
                }
}



朋友不好意思啊,刚才那个粘贴错了,改了的代码在这里,进行了异常捕捉。你看看吧
回复 使用道具 举报
还有点我想给你说的是,你的异常你只是在你写的方法里面抛出了异常,但是在main方法里面没有抛出异常,这样你肯定会错误啊,你试试同时在main方法那里也抛出异常,我敢保证一定能正确运行,上面那个是我捕捉了异常,第二种就是你在main方法里面也抛出异常,那就没问题了!去试试吧
回复 使用道具 举报
哥们我在给你补充点,你相当于是方法把异常抛出来了,但是main方法没有抛啊,就相当于,一个公司的小组长遇到不能解决的问题,他只有把问题抛给比他级别更高的领导解决啊,所以下次记住了如果方法抛了异常的话,main方法一定也要抛出异常,不然main方法也会处理不了的,main方法处理不了的,你抛出来让JVM去处理
回复 使用道具 举报
邓海涛 发表于 2012-4-8 14:45
还有点我想给你说的是,你的异常你只是在你写的方法里面抛出了异常,但是在main方法里面没有抛出异常,这样 ...

谢谢哈,你比较牛!!
回复 使用道具 举报
呵呵。大家相互学习!
回复 使用道具 举报
pray 高级黑马 2014-4-26 05:39:28
10#
让人翻译成36种不同外语流传国内外世界各地的好帖
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马