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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 木木赤赤 中级黑马   /  2013-12-30 11:33  /  1060 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这是一个生产者与消费者的例子。
关于catch的使用,为什么不在12处处理异常,而要在34处处理异常。
这种处理方式的目的和意义什么?

importjava.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
importjava.util.concurrent.locks.ReentrantLock;
public class ProducerConsumerDemo {
       publicstatic void main(String[] args) {
              Resourcer = new Resource();
              Producerpro= new Producer(r);
              Consumercon= new Consumer(r);
              newThread(pro).start();
              newThread(pro).start();
              newThread(con).start();
              newThread(con).start();
       }
}
class Resource {
       privateString name;
       privateint count = 1;
       privateboolean flag = false;
       privateLock lock = new ReentrantLock();
       privateCondition pro_condition = lock.newCondition();
       privateCondition con_condition = lock.newCondition();
       publicvoid set(String name) throws InterruptedException {
              lock.lock();
              try{
                     while(flag)
                            pro_condition.await();
                     this.name= name + "-" + count++;
                     System.out.println(Thread.currentThread().getName()+ "...生产者。。。"
                                   +this.name);
                     flag= true;
                     con_condition.signal();
              }//
finally {
                     lock.unlock();
              }
       }
       publicvoid out() throws InterruptedException {
              lock.lock();
              try{
                     while(!flag)
                            con_condition.await();
                     System.out.println(Thread.currentThread().getName()+ "。。。...消费者。。."
                                   +this.name);
                     flag= false;
                     pro_condition.signal();
              }//
finally {
                     lock.unlock();
              }
       }
}
class Producer implements Runnable {
       publicProducer(Resource r) {
              super();
              this.r= r;
       }
       privateResource r;
       publicvoid run() {
              while(true) {
                     try{
                            r.set("+商品+");
                     }catch (InterruptedException e) {//
                            //TODO Auto-generated catch block
                             e.printStackTrace();
                     }
              }
       }
}
class Consumer implements Runnable {
       privateResource r;
       publicConsumer(Resource r) {
              super();
              this.r= r;
       }
       publicvoid run() {
              while(true) {
                     try{
                            r.out();
                     }catch (InterruptedException e) {//
                            //TODO Auto-generated catch block
                             e.printStackTrace();
                     }
              }
       }
}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 布鲁Go 于 2013-12-30 14:22 编辑

恩,简单说说我的理解吧。
我觉得这里关于catch的使用,1和2那里处处理异常主要是为了加一个finally 把资源给关了。之所谓为什么不用catch,而是直接抛出去,其实我觉得差别不大,包括后面的在3和4那里处理异常了,但还是打印默认的。。。e.printStackTrace(); 意义不大。。在真实的开发中,感觉都不会用这样简单的处理。

我们可以回想毕老师最开始讲异常的时候,说为了除零这么小的问题就导致程序直接停止,不科学,所以在把异常包起来,内部处理,然后后面的程序可以继续运行。也就是说,具体异常怎么处理,其实是看实际需求的,没有固定非要怎么样。如果你希望程序有小错误就停止,那就不处理,如果你希望小错误自己知道就可以,先跑一跑再说,那就try catch处理一下!比汽车可能会掉漆了,你觉得掉漆了就是不能上路,就不处理,只要掉漆就停车。而你觉得掉漆了是小事,就用try监听一下,然后如果掉漆了了,你是司机,会告知你一下,嘿,掉漆了,你说,哦知道了,然后继续开。。。但如果是轮子螺丝掉了一个,你就可以设置成Runtime异常,就是一定要停车。  

还有,复杂点,譬如冒烟那节课,catch处理冒烟异常姿势为了把他转成另一个调用毕老师的张校长可以吹的听课异常。。。同样可以类比为,开车可能会碰到风太大了的异常,但是风太大是司机处理不了的异常,但是try一下“风太大”,转换成告诉司机 “窗户开太大了” 的异常,然后司机处理。

在课堂上老师讲异常的时候,你看很多时候多挺随意的,说明这个不是那么严谨的非要如何如何,其实都是按实际需求的。。而且老师也有提到,实际开发其实都看异常日志的。。。譬如上面,finally 关闭资源我觉得是一定要有的,所以就可硬要有。只是是否catch。就看自己理解了。包括什么属于Runtime异常,这个其实也是java程序员设计java的是人定的。。所以,个人感觉不用太纠结这样的问题。

恩,有点啰嗦,不过都是自己的理解,希望对你有用。。。
回复 使用道具 举报
try,catch一共有3种句式:
1.try{}catch(){}
2.try{}catch(){}finally{}
3.try{}finally{}

其中,前2种是用来捕获异常的,因为有catch。
第3种,并不是用来处理异常的。必须要执行的代码可以放在try,finally语句中。比如你例子中的释放锁的代码。IO中释放资源的代码通常也放在try,finally语句中。跟捕获异常没有关系。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马