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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 周素强 于 2012-5-5 11:10 编辑
  1. import java.util.concurrent.locks.*;
  2. class ProducerConsumerLock
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Resource r = new Resource();

  7.                 Thread pro1 = new Thread(new Producer(r));
  8.                 Thread pro2 = new Thread(new Producer(r));
  9.                 Thread con1 = new Thread(new Consumer(r));
  10.                 Thread con2 = new Thread(new Consumer(r));
  11.                 pro1.start();
  12.                 pro2.start();
  13.                 con1.start();
  14.                 con2.start();
  15.         }
  16. }

  17. class Resource
  18. {
  19.         private String name;
  20.         private int count = 1;
  21.         private boolean flag = false;
  22.         Lock lock = new ReentrantLock();
  23.         Condition con_pro = lock.newCondition();
  24.         Condition con_con = lock.newCondition();
  25.         

  26.         public void set(String name)
  27.         {
  28.                 lock.lock();
  29.                 try
  30.                 {
  31.                         while(flag)
  32.                                 try
  33.                                 {
  34.                                         con_pro.await();
  35.                                 }
  36.                                 catch (InterruptedException e)
  37.                                 {
  38.                                         //此处的异常应该怎么处理,我的意思是说线程真有冻结时应该怎么处理,Thread的interrupt()方法应该用在哪里?
  39.                                 }
  40.                                 
  41.                         this.name = name+"---"+count++;
  42.                         System.out.println(Thread.currentThread().getName()+".....生产者"+this.name);
  43.                         flag = true;
  44.                         con_con.signal();
  45.                 }
  46.                 finally
  47.                 {
  48.                         lock.unlock();
  49.                 }
  50.                
  51.         }
  52.         public void out()
  53.         {
  54.                 lock.lock();
  55.                 try
  56.                 {
  57.                         while(!flag)
  58.                                 try
  59.                                 {
  60.                                         con_con.await();
  61.                                 }
  62.                                 catch (InterruptedException e)
  63.                                 {
  64.                                        
  65.                                 }
  66.                                 
  67.                         System.out.println(Thread.currentThread().getName()+"..消费者"+this.name);
  68.                         flag = false;
  69.                         con_pro.signal();
  70.                 }
  71.                 finally
  72.                 {
  73.                         lock.unlock();
  74.                 }
  75.         }
  76. }

  77. class Producer implements Runnable
  78. {
  79.         private Resource res;
  80.         Producer(Resource res)
  81.         {
  82.                 this.res=res;
  83.         }
  84.         public void run()
  85.         {
  86.                 while(true)
  87.                 {
  88.                         res.set("商品");                        
  89.                 }
  90.         }
  91. }

  92. class Consumer implements Runnable
  93. {
  94.         private Resource res;
  95.         Consumer(Resource res)
  96.         {
  97.                 this.res=res;
  98.         }
  99.         public void run()
  100.         {
  101.                 while(true)
  102.                 {
  103.                         res.out();                        
  104.                 }
  105.         }
  106. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

3 个回复

倒序浏览
interrupt方法在执行后本身就会抛出一个异常,所以不应该把interrupt写在catch里面,这样一定会报错~~~加分哈~~~{:soso_e144:}

评分

参与人数 2技术分 +1 黑马币 +6 收起 理由
贠(yun)靖 + 1
周素强 + 6 神马都是浮云

查看全部评分

回复 使用道具 举报
public void set(String name)

30.        {

31.                lock.lock();

32.                try

33.                {

34.                        while(flag)

35.                                try

36.                                {

37.                                        con_pro.await();

38.                                }

39.                                catch (InterruptedException e)

40.                                {

41.          e.printStackTrace();                              //此处打印异常信息就可以了
42.                                }

43.                                

44.                        this.name = name+"---"+count++;

45.                        System.out.println(Thread.currentThread().getName()+".....生产者"+this.name);

46.                        flag = true;

47.                        con_con.signal();

48.                }

49.                finally

50.                {

51.                        lock.unlock();

52.                }

53.               

54.        }
在main()方法中添加interrupt()方:
public static void main(String[] args)

05.        {

06.                Resource r = new Resource();

07.

08.                Thread pro1 = new Thread(new Producer(r));

09.                Thread pro2 = new Thread(new Producer(r));

10.                Thread con1 = new Thread(new Consumer(r));

11.                Thread con2 = new Thread(new Consumer(r));

12.                pro1.start();

13.                pro2.start();

14.                con1.start();
  
15.                con2.start();
                     con1.interrupt();
                     con2.interrup();
                     pro1.interrup();
16.        }

四个线程都可以调用interrupt方法,随意。out()方法里的异常可以像set()方法里一样处理。如果想异常信息更详细,可以在catch里添加一条打印中文的字符串,说明是什么样的异常。
回复 使用道具 举报
public void set(String name)

30.        {

31.                lock.lock();

32.                try

33.                {

34.                        while(flag)

35.                                try

36.                                {

37.                                        con_pro.await();

38.                                }

39.                                catch (InterruptedException e)

40.                                {

41.          e.printStackTrace();                              //此处打印异常信息就可以了
42.                                }

43.                                

44.                        this.name = name+"---"+count++;

45.                        System.out.println(Thread.currentThread().getName()+".....生产者"+this.name);

46.                        flag = true;

47.                        con_con.signal();

48.                }

49.                finally

50.                {

51.                        lock.unlock();

52.                }

53.               

54.        }
在main()方法中添加interrupt()方:
public static void main(String[] args)

05.        {

06.                Resource r = new Resource();

07.

08.                Thread pro1 = new Thread(new Producer(r));

09.                Thread pro2 = new Thread(new Producer(r));

10.                Thread con1 = new Thread(new Consumer(r));

11.                Thread con2 = new Thread(new Consumer(r));

12.                pro1.start();

13.                pro2.start();

14.                con1.start();
  
15.                con2.start();
                     con1.interrupt();
                     con2.interrup();
                     pro1.interrup();
16.        }

四个线程都可以调用interrupt方法,随意。out()方法里的异常可以像set()方法里一样处理。如果想异常信息更详细,可以在catch里添加一条打印中文的字符串,说明是什么样的异常。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马