黑马程序员技术交流社区

标题: 异常中的问题 [打印本页]

作者: 安阳    时间: 2013-8-20 20:19
标题: 异常中的问题
本帖最后由 安阳 于 2013-8-26 21:58 编辑

try...finally搭配的话,一般怎么用,什么情况常用啊?
作者: 乖睡觉咯    时间: 2013-8-20 22:11
不管程序有无异常都需要执行 finally
finally的作用用来关闭流、关闭连接、释放或销毁资源。
作者: 吕振中    时间: 2013-8-20 22:28
  1. import java.util.concurrent.locks.*;

  2. class ProducerConsumerDemo2
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Resource r = new Resource();

  7.                 Producer pro = new Producer(r);
  8.                 Consumer con = new Consumer(r);

  9.                 Thread t1 = new Thread(pro);
  10.                 Thread t2 = new Thread(pro);
  11.                 Thread t3 = new Thread(con);
  12.                 Thread t4 = new Thread(con);

  13.                 t1.start();
  14.                 t2.start();
  15.                 t3.start();
  16.                 t4.start();

  17.         }
  18. }

  19. /*
  20. JDK1.5 中提供了多线程升级解决方案。
  21. 将同步Synchronized替换成现实Lock操作。
  22. 将Object中的wait,notify notifyAll,替换了Condition对象。
  23. 该对象可以Lock锁 进行获取。
  24. 该示例中,实现了本方只唤醒对方操作。

  25. Lock:替代了Synchronized
  26.         lock
  27.         unlock
  28.         newCondition()

  29. Condition:替代了Object wait notify notifyAll
  30.         await();
  31.         signal();
  32.         signalAll();
  33. */
  34. class Resource
  35. {
  36.         private String name;
  37.         private int count = 1;
  38.         private boolean flag = false;
  39.                         //  t1    t2
  40.         private Lock lock = new ReentrantLock();

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



  43.         public  void set(String name)throws InterruptedException
  44.         {
  45.                 lock.lock();
  46.                 try
  47.                 {
  48.                         while(flag)
  49.                                 condition_pro.await();//t1,t2
  50.                         this.name = name+"--"+count++;

  51.                         System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
  52.                         flag = true;
  53.                         condition_con.signal();
  54.                 }
  55.                 finally
  56.                 {
  57.                         lock.unlock();//释放锁的动作一定要执行。
  58.                 }
  59.         }


  60.         //  t3   t4  
  61.         public  void out()throws InterruptedException
  62.         {
  63.                 lock.lock();
  64.                 try
  65.                 {
  66.                         while(!flag)
  67.                                 condition_con.await();
  68.                         System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
  69.                         flag = false;
  70.                         condition_pro.signal();
  71.                 }
  72.                 finally
  73.                 {
  74.                         lock.unlock();
  75.                 }
  76.                
  77.         }
  78. }

  79. class Producer implements Runnable
  80. {
  81.         private Resource res;

  82.         Producer(Resource res)
  83.         {
  84.                 this.res = res;
  85.         }
  86.         public void run()
  87.         {
  88.                 while(true)
  89.                 {
  90.                         try
  91.                         {
  92.                                 res.set("+商品+");
  93.                         }
  94.                         catch (InterruptedException e)
  95.                         {
  96.                         }
  97.                        
  98.                 }
  99.         }
  100. }

  101. class Consumer implements Runnable
  102. {
  103.         private Resource res;

  104.         Consumer(Resource res)
  105.         {
  106.                 this.res = res;
  107.         }
  108.         public void run()
  109.         {
  110.                 while(true)
  111.                 {
  112.                         try
  113.                         {
  114.                                 res.out();
  115.                         }
  116.                         catch (InterruptedException e)
  117.                         {
  118.                         }
  119.                 }
  120.         }
  121. }
复制代码
您好!

finally语句的代码块特点是无论异常是否被捕获都是要被执行的,放在try...catch语句后使用。但特殊情况除外(finally语句之前执行了System.exit(0);)放在try...catch语句后使用。
finally最常见的应用为关闭资源;如在多线程应用里释放锁资源,上面代码是毕老师在讲多线程时的代码,供您参考。





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