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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李杰 初级黑马   /  2012-8-18 16:15  /  1458 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

举例说明,最好是毕老师的代码:)

点评

请通过版块上面的改名通道,改下名字。  发表于 2012-8-18 19:06

3 个回复

倒序浏览
  1. public class InputOutputDemo2
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Res1 r=new Res1();
  6.                 Thread t1=new Thread(new Input1(r));//1.创建了一个Input线程;
  7.                 Thread t2=new Thread(new Output1(r));
  8. //2.创建了一个Output线程;
  9.                 t1.start();
  10.                 t2.start();
  11.                
  12.         }
  13. }
  14. class Res1
  15. {
  16.         private String name;
  17.         private String sex;
  18.         private boolean flag=false;//初始标记为false;
  19.         public synchronized void set(String name,String sex)
  20.         {
  21.                 if(flag)
  22.                         try{this.wait();}catch(InterruptedException e){}
  23.                 this.name=name;
  24.                 this.sex=sex;
  25.                 flag=true;
  26.                 this.notify();
  27.         }
  28.         public synchronized void out()
  29.         {
  30.                 if(!flag)
  31.                         try{this.wait();}catch(InterruptedException e){}
  32.                 System.out.println(name+"-----"+sex);
  33.                 flag=false;
  34.                 this.notify();
  35.         }
  36. }
  37. class Input1 implements Runnable
  38. {
  39.         private Res1 r;
  40.         Input1(Res1 r)
  41.         {
  42.                 this.r=r;
  43.         }
  44.         public void run()//3.假设t1先执行。
  45.         {
  46.                 int x=0;
  47.                 while(true)
  48.                 {
  49.                         if(x==0)
  50.                                 r.set("zhangsan","man");//4.到此调用set方法,flag为假,赋值。将flag置为true。
  51.                         else
  52.                                 r.set("lisi","woman");//6.因为循环执行这个set方法,flag为真,当前线程wait(),并放弃this锁。t2开始执行。
  53.                         x=(x+1)%2;//5.x由0变为1.
  54.                 }
  55.         }
  56. }
  57. class Output1 implements Runnable
  58. {
  59.         private Res1 r;
  60.         Output1(Res1 r)
  61.         {
  62.                 this.r=r;
  63.         }
  64.         public void run()
  65.         {
  66.                 while(true)
  67.                 {
  68.                         r.out();//(!flag)为flase,输出,flag置为假。循环,(!flag)为真,wait()。notify()将t1唤醒。
  69.                 }
  70.         }
  71. }

复制代码
这是只有两个线程的情况,当出现多线程时,便会出现错误。
在线程间通讯时使用Lock更为方便,更有针对性。
  1. package day12;

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

  5. public class ProducerCustomerDemo2
  6. {
  7.                 public static void main(String[] args)
  8.                 {
  9.                         Resource1 r=new Resource1();
  10.                         Producer1 p=new Producer1(r);
  11.                         Customer1 c=new Customer1(r);
  12.                         Thread t1=new Thread(p);
  13.                         Thread t2=new Thread(p);
  14.                         Thread t3=new Thread(c);
  15.                         Thread t4=new Thread(c);
  16.                         t1.start();
  17.                         t2.start();
  18.                         t3.start();
  19.                         t4.start();
  20.                 }
  21. }
  22. class Resource1
  23. {
  24.         private String name;
  25.         private int count;
  26.         private boolean flag=false;
  27.         private Lock lock=new ReentrantLock();//1.5版本新特性。相当与synchronized语句。
  28.         //private Condition condition=lock.newCondition();//Condition相当与监视器方法,由lock的newCondition()方法获取。
  29.         private Condition condition_pro=lock.newCondition();//每个lock可以建立多个condition,它们可以互相等待唤醒。
  30.         private Condition condition_cus=lock.newCondition();
  31.         public void set(String name)throws InterruptedException
  32.         {
  33.                 lock.lock();//上锁
  34.                 try
  35.                 {
  36.                         while(flag)
  37.                                 condition_pro.await();//由await()替换wait()方法
  38.                         this.name=name+"----"+count++;
  39.                         System.out.println(Thread.currentThread().getName()+"...生产者。。。"+this.name);
  40.                         flag=true;
  41.                         condition_cus.signal();//由signal()替换notify(),由signalAll()替换notifyAll()。只唤醒消费方法;
  42.                 }
  43.                 finally
  44.                 {
  45.                         lock.unlock();
  46.                 }
  47.         }
  48.         public void out()throws InterruptedException
  49.         {
  50.                 lock.lock();
  51.                 try
  52.                 {
  53.                         while(!flag)
  54.                                 condition_cus.await();
  55.                         System.out.println(Thread.currentThread().getName()+"...消费者。。。。。。。。"+this.name);
  56.                         flag=false;
  57.                         condition_pro.signal();//只唤醒生产方法。
  58.                 }
  59.                 finally
  60.                 {
  61.                         lock.unlock();
  62.                 }
  63.         }
  64. }
  65. class Producer1 implements Runnable
  66. {
  67.         private Resource1 r;
  68.         Producer1(Resource1 r)
  69.         {
  70.                 this.r=r;
  71.         }
  72.         public void run()
  73.         {
  74.                 while(true)
  75.                 {
  76.                         try
  77.                         {
  78.                                 r.set("商品");
  79.                         }
  80.                         catch(InterruptedException e){}
  81.                 }
  82.         }
  83. }
  84. class Customer1 implements Runnable
  85. {
  86.         private Resource1 r;
  87.         Customer1(Resource1 r)
  88.         {
  89.                 this.r=r;
  90.         }
  91.         public void run()
  92.         {
  93.                 while(true)
  94.                 {
  95.                         try
  96.                         {
  97.                                 r.out();
  98.                         }
  99.                         catch(InterruptedException e){}
  100.                 }
  101.         }
  102. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我一般回答没人回答的简单问题..有人回答的我一般不看..可这样都抢不到分

点评

可是分不是够了么?嘿嘿  发表于 2012-8-18 19:05
回复 使用道具 举报
黑马连家华 发表于 2012-8-18 17:28
我一般回答没人回答的简单问题..有人回答的我一般不看..可这样都抢不到分

张同学 此言差矣 技术分就像钱一样 越多越开心 别人会羡慕我的

点评

呵呵,还不如说黑马的技术分是一种追求啊!  发表于 2012-8-25 21:24

评分

参与人数 1黑马币 +30 收起 理由
田建 + 30

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马