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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

看完视频后总结,
第一种方法
  1. package org.heima1;

  2. public class Test7 {

  3.         /**
  4.          * 生产者消费者问题
  5.          */
  6.         public static void main(String[] args) {
  7.                 Resource r=new Resource();
  8.                 productor p=new productor(r);
  9.                 consumer c=new consumer(r);
  10.                
  11.                 Thread t1=new Thread(p);
  12.                 Thread t2=new Thread(p);
  13.                 Thread t3=new Thread(c);
  14.                 Thread t4=new Thread(c);
  15.                 t1.start();
  16.                 t2.start();
  17.                 t3.start();
  18.                 t4.start();
  19.         }

  20. }
  21. class Resource{
  22.         private String name;
  23.         private int count=0;
  24.         private Boolean flag=false;
  25.        
  26.         public synchronized void set(String name){
  27.                 while(flag){  //必须用while循环判断,如果用if,就会出现极端情况
  28.                         try {
  29.                                 wait();
  30.                         } catch (InterruptedException e) {
  31.                                 // TODO Auto-generated catch block
  32.                                 e.printStackTrace();
  33.                         }                       
  34.                 }
  35.                 this.name=name+"----"+count++;
  36.                 System.out.println(Thread.currentThread().getName()+"。。。生产者。。。"+this.name);
  37.                 flag=true;
  38.                 notifyAll();//必须用notifyAll,防止只唤醒自己的线程
  39.         }
  40.         public synchronized void out(){
  41.                
  42.                 while(!flag){  //必须用while循环判断,如果用if,就会出现极端情况
  43.                         try {
  44.                                 wait();
  45.                         } catch (InterruptedException e) {
  46.                                 // TODO Auto-generated catch block
  47.                                 e.printStackTrace();
  48.                         }                       
  49.                 }
  50.                 System.out.println(Thread.currentThread().getName()+"。消费者。。"+this.name);
  51.                 flag=false;
  52.                 notifyAll();//必须用notifyAll,防止只唤醒自己的线程
  53.         }
  54. }
  55. class productor implements Runnable{
  56.         private Resource r;
  57.         productor(Resource r){
  58.                 this.r=r;
  59.         }
  60.         public void run(){
  61.                 while(true){
  62.                         r.set("商品");
  63.                 }
  64.         }
  65. }
  66. class consumer implements Runnable{
  67.         private Resource r;
  68.         consumer(Resource r){
  69.                 this.r=r;
  70.         }
  71.         public void run(){
  72.                 while(true){
  73.                         r.out();
  74.                 }
  75.         }
  76. }
复制代码
第二种方法解决
  1. package org.heima1;

  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;

  5. public class Test8{

  6.         /**
  7.          * 生产者消费者问题,利用Lock解决
  8.          */
  9.         public static void main(String[] args) {
  10.                 Resource1 r=new Resource1();
  11.                 productor1 p=new productor1(r);
  12.                 consumer1 c=new consumer1(r);
  13.                
  14.                 Thread t1=new Thread(p);
  15.                 Thread t2=new Thread(p);
  16.                 Thread t3=new Thread(c);
  17.                 Thread t4=new Thread(c);
  18.                 t1.start();
  19.                 t2.start();
  20.                 t3.start();
  21.                 t4.start();
  22.         }

  23. }
  24. class Resource1{
  25.         private String name;
  26.         private int count=0;
  27.         private Boolean flag=false;
  28.         private Lock lock=new ReentrantLock();
  29.         private Condition con1=lock.newCondition();
  30.         private Condition con2=lock.newCondition();
  31.        
  32.         public  void set(String name){
  33.                 lock.lock();
  34.                 try {
  35.                         while(flag){  //必须用while循环判断,如果用if,就会出现极端情况
  36.                                 try {
  37.                                         con1.await();
  38.                                 } catch (InterruptedException e) {
  39.                                         // TODO Auto-generated catch block
  40.                                         e.printStackTrace();
  41.                                 }                       
  42.                         }
  43.                         this.name=name+"----"+count++;
  44.                         System.out.println(Thread.currentThread().getName()+"。。。生产者。。。"+this.name);
  45.                         flag=true;
  46.                         con2.signal();//唤醒对方的一个线程
  47.                 } catch (Exception e) {
  48.                         // TODO Auto-generated catch block
  49.                         e.printStackTrace();
  50.                 }finally{
  51.                         lock.unlock();
  52.                 }
  53.         }
  54.         public void out(){
  55.                 lock.lock();
  56.                 try {
  57.                         while(!flag){  //必须用while循环判断,如果用if,就会出现极端情况
  58.                                 try {
  59.                                         con2.await();
  60.                                 } catch (InterruptedException e) {
  61.                                         // TODO Auto-generated catch block
  62.                                         e.printStackTrace();
  63.                                 }                       
  64.                         }
  65.                         System.out.println(Thread.currentThread().getName()+"。消费者。。"+this.name);
  66.                         flag=false;
  67.                         con1.signal();
  68.                 } catch (Exception e) {
  69.                         // TODO Auto-generated catch block
  70.                         e.printStackTrace();
  71.                 }finally{
  72.                         lock.unlock();
  73.                 }
  74.         }
  75. }
  76. class productor1 implements Runnable{
  77.         private Resource1 r;
  78.         productor1(Resource1 r){
  79.                 this.r=r;
  80.         }
  81.         public void run(){
  82.                 while(true){
  83.                         r.set("商品");
  84.                 }
  85.         }
  86. }
  87. class consumer1 implements Runnable{
  88.         private Resource1 r;
  89.         consumer1(Resource1 r){
  90.                 this.r=r;
  91.         }
  92.         public void run(){
  93.                 while(true){
  94.                         r.out();
  95.                 }
  96.         }
  97. }
复制代码

2 个回复

倒序浏览
哦   这代码写的   哪个多啊    绝对牛掰   虽然我现在还看不懂
回复 使用道具 举报
菜鸟的求学路 发表于 2015-5-22 00:11
哦   这代码写的   哪个多啊    绝对牛掰   虽然我现在还看不懂

:'(这是基础视频上教的代码,只是感觉很好,就顺道敲下来了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马