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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 追逐 高级黑马   /  2014-3-19 00:57  /  1067 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 追逐 于 2014-3-21 19:35 编辑

1,运用同步


/*
生产者消费者问题
对于生产多个生产者和消费者
为什么要定义while判断标记。
原因:让被唤醒的线程再一次判断标记

为什么要定义notifyAll
以为需要唤醒对方线程
因为只用notify,容易出现只唤醒本方线程的情况,导致程序中的所有程序都等待

*/
  1. //资源类
  2. class Resource {
  3.         
  4.         private String name;
  5.         private int a = 0;
  6.         private boolean b = false; //定义标签
  7.         public synchronized void set(String name) { //往里面输入
  8.                 while(b)
  9.                         try{
  10.                                 this.wait();
  11.                         } catch(InterruptedException e) {}
  12.                 this.name = name + "..." + a++;
  13.                 System.out.println(Thread.currentThread().getName() + "生产者..." + this.name);
  14.                 this.b = true;
  15.                 this.notifyAll();
  16.         }
  17.         
  18.         public synchronized void out() {
  19.                 while(!b)
  20.                         try {
  21.                                 this.wait();
  22.                         } catch(InterruptedException e) {}
  23.                 System.out.println(Thread.currentThread().getName() + "............消费者..." + this.name);
  24.                 this.b = false;
  25.                 this.notifyAll();
  26.         }
  27.         
  28. }

  29. //生产者
  30. class Produser implements Runnable {

  31.         private Resource r;
  32.         Produser(Resource r) {
  33.                 this.r = r;
  34.         }
  35.         
  36.         public void run() {
  37.                 while(true) {
  38.                         r.set("理学院");
  39.                 }
  40.         }
  41.         
  42. }

  43. //消费者
  44. class Consumer implements Runnable {
  45.         
  46.         private Resource r;
  47.         Consumer(Resource r) {
  48.                 this.r = r;
  49.         }
  50.         
  51.         public void run() {
  52.                 while(true) {
  53.                         r.out();
  54.                 }
  55.         }
  56.         
  57. }

  58. //运行类
  59. class ProduserConsumerDemo {
  60.         public static void main(String[] args) {
  61.                 Resource r = new Resource();
  62.                 Produser p = new Produser(r);
  63.                 Consumer c = new Consumer(r);
  64.                 Thread t1 = new Thread(p);
  65.                 Thread t2 = new Thread(p);
  66.                 Thread t3 = new Thread(c);
  67.                 Thread t4 = new Thread(c);
  68.                 t1.start();
  69.                 t2.start();
  70.                 t3.start();
  71.                 t4.start();
  72.         }
  73. }







  74. 1,升级版的JDK新做法
  75. import java.util.concurrent.locks.*;

  76. /*
  77.         JDK1.5中提供了多线程升级解决方案。
  78.         将同步synchronized替换成显示的Lock操作。
  79.         将Object中的wait,notify,notifyAll,替换成了Condition对象
  80.         该对象可以Lock锁,进行获取。
  81.         该示例中,实现了本方只唤醒对方的操作。

  82.         消费者和生产者问题

  83. */
  84. //定义资源类
  85. class Resource1 {
  86.         
  87.         private Lock lock = new ReentrantLock();
  88.         private Condition condition_pro = lock.newCondition(); //创建生产者锁对象
  89.         private Condition condition_con = lock.newCondition(); //创建消费者锁对象
  90.         private boolean b = false; //创建一个标记
  91.         private String name;
  92.         private int a = 1;
  93.         public void set(String name) throws InterruptedException {
  94.                 lock.lock(); //创建锁
  95.                 try        {
  96.                         while(b)
  97.                                 condition_pro.await(); //生产者沉睡
  98.                         this.name = name + "......" + a++;
  99.                         System.out.println(Thread.currentThread().getName() + "生产者..." + name);
  100.                         this.b = true;
  101.                         condition_con.signal(); //唤醒消费者
  102.                 } finally {
  103.                         lock.unlock(); //释放锁
  104.                 }
  105.         }

  106.         public void out() throws InterruptedException {
  107.                 lock.lock(); //创建锁
  108.                 try {
  109.                         while(!b)
  110.                                 condition_con.await(); //消费者沉睡
  111.                         System.out.println(Thread.currentThread().getName() + ".......消费者........" + name);
  112.                         this.b = false;
  113.                         condition_pro.signal(); //唤醒生产者
  114.                 } finally {
  115.                         lock.unlock(); //释放锁
  116.                 }
  117.                
  118.         }
  119. }

  120. //定义生产者
  121. class Produser1 implements Runnable {

  122.         private Resource1 r;
  123.         Produser1(Resource1 r) {
  124.                 this.r = r;
  125.         }

  126.         public void run() {
  127.                 while(true) {
  128.                         try {
  129.                                 r.set("张三");
  130.                         } catch(InterruptedException e) {}
  131.                 }
  132.         }

  133. }

  134. //定义消费者
  135. class Consumer1 implements Runnable {
  136.         
  137.         private Resource1 r;
  138.         Consumer1(Resource1 r) {
  139.                 this.r = r;
  140.         }

  141.         public void run() {
  142.                 while(true) {
  143.                         try {
  144.                                 r.out();
  145.                         } catch(InterruptedException e) {}
  146.                 }
  147.         }

  148. }

  149. class ProduserConsumerDemo1 {
  150.         public static void main(String[] args) {
  151.                 Resource1 r = new Resource1();
  152.                 Produser1 pro = new Produser1(r);
  153.                 Consumer1 con = new Consumer1(r);
  154.                 Thread t1 = new Thread(pro);
  155.                 Thread t2 = new Thread(pro);
  156.                 Thread t3 = new Thread(con);
  157.                 Thread t4 = new Thread(con);
  158.                 t1.start();
  159.                 t2.start();
  160.                 t3.start();
  161.                 t4.start();
  162.         }
  163. }
复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马