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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jonn 高级黑马   /  2013-3-8 10:25  /  1576 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. import java.util.Random;
  2. import java.util.concurrent.CountDownLatch;
  3. import java.util.concurrent.locks.Condition;
  4. import java.util.concurrent.locks.Lock;
  5. import java.util.concurrent.locks.ReentrantLock;

  6. public class ConditionDemo {
  7.         private final Lock lock = new ReentrantLock();
  8.         private final Condition isFull = lock.newCondition();
  9.         private final Condition isEmtry = lock.newCondition();
  10.         private String[] data = new String[10];
  11.         private int len, getStr,putStr;
  12.         private StringBuilder buff = new StringBuilder();
  13.         public void putData(){
  14.                 lock.lock();
  15.                 System.out.println("正在填充数据...");
  16.                 try{
  17.                         while(len==data.length){
  18.                                 System.out.println(Thread.currentThread().getName()+" 填充完毕...");  // 这里无法打印
  19.                                 putStr=buff.length();
  20.                                 try{
  21.                                         isFull.await();
  22.                                 }catch(InterruptedException e){
  23.                                         System.err.println(e.toString());
  24.                                 }
  25.                         }
  26.                         while(putStr<=data.length){
  27.                         if(putStr==data.length){
  28.                                 putStr = 0;
  29.                                 break;
  30.                         }
  31.                         data[putStr] = String.valueOf(new Random().nextInt(100));
  32.                         System.out.println("data["+putStr+"]="+data[putStr]);
  33.                         ++putStr;
  34.                         ++len;
  35.                         }
  36.                         isEmtry.signal();
  37.                 }finally{
  38.                         lock.unlock();
  39.                 }
  40.                
  41.         }
  42.         public void getData(){
  43.                 lock.lock();
  44.                 System.out.println("正在截获信息...");  // 运行到这里,卡住了
  45.                 try{
  46.                         while(len==0){                       
  47.                                 System.out.println(Thread.currentThread().getName()+"截获数据完毕...");
  48.                                 System.out.println(buff.toString());
  49.                                 try {
  50.                                         isEmtry.await();
  51.                                 } catch (InterruptedException e) {
  52.                                         e.printStackTrace();
  53.                                 }
  54.                         }
  55.                  while(getStr<=data.length){
  56.                  if(getStr==data.length){
  57.                          getStr = 0;
  58.                          break;
  59.                  }
  60.                  String info = data[getStr];
  61.                  buff.append(info+",");
  62.              ++getStr;
  63.                  --len;
  64.                  }
  65.                  isFull.signal();
  66.                 }finally{
  67.                         lock.unlock();
  68.                 }
  69.         }
  70.         public static void main(String[] args) {
  71.            final ConditionDemo condition = new ConditionDemo();
  72.            final CountDownLatch latch = new CountDownLatch(1);
  73.          
  74.            new Thread(new Runnable(){
  75.                   
  76.                   @Override
  77.                   public void run(){
  78.                         condition.putData();
  79.                         latch.countDown();
  80.                   }
  81.            }).start();
  82.           
  83.            try {
  84.                                  latch.await();
  85.                           } catch (InterruptedException e) {               
  86.                                         e.printStackTrace();
  87.                         }
  88.           
  89.               condition.getData();
  90.         }

  91. }
复制代码

3 个回复

倒序浏览
我是新手。。但是我测试了一下
  1. public void getData(){

  2.                 lock.lock();

  3.                 System.out.println("正在截获信息...");  // 运行到这里,卡住了

  4.                 try{

  5.                         while(len==0){                        //因为没输出Thread.currentThread().getName()+"截获数据完毕...",所以len应该是!=0吧,你改成while(len!=0)试试
  6.                                 System.out.println(Thread.currentThread().getName()+"截获数据完毕...");

  7.                                 System.out.println(buff.toString());

  8.                                 try {

  9.                                         isEmtry.await();

  10.                                 } catch (InterruptedException e) {

  11.                                         e.printStackTrace();

  12.                                 }

  13.                         }

复制代码
回复 使用道具 举报
张子凯 发表于 2013-3-8 10:57
我是新手。。但是我测试了一下

另外监视器获取一个数据,长度减少一个,当截取完数据,长度应当为0,这里不用修改
回复 使用道具 举报
赵文 发表于 2013-3-8 11:01
另外监视器获取一个数据,长度减少一个,当截取完数据,长度应当为0,这里不用修改 ...

我新手。。毕老师的视频才学到第8天,来凑个热闹,而且改了确实不对。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马