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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hyace 中级黑马   /  2014-4-1 09:20  /  1896 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 朱神必 于 2014-4-1 18:04 编辑

用lock加锁编的生产者消费者,但是编译卡住,看提示貌似是导包的问题,可这样导有什么问题啊。。。?代码整段上来,应该只是导包问题,谢谢。
  1. /**
  2. 生产者消费者问题:
  3. */
  4. import java.util.*;
  5. class Resource
  6. {
  7.         private String name;
  8.         private int count = 1;
  9.         private boolean flag = false;
  10.         //创建锁对象
  11.         Lock lock = new ReentrantLock();
  12.         //给lock配两把锁
  13.         Condition pro_con = lock.newCondition();
  14.         Condition cus_con = lock.newCondition();
  15.         public void set(String name){
  16.                 lock.lock();
  17.                 try{
  18.                         while(flag)
  19.                                 try{pro_con.await();}catch(InterruptedException e){}
  20.                         this.name = name+count;
  21.                         count++;
  22.                         System.out.println(Thread.currentThread().getName()+"——生产者——"+this.name);
  23.                         flag = true;
  24.                         cus_con.signal();
  25.                 }
  26.                 finally{
  27.                         lock.unlock();
  28.                 }
  29.         }
  30.         public void out(){
  31.                 lock.lock();
  32.                 try{
  33.                         while(!flag)
  34.                                 try{cus_con.await();}catch(InterruptedException e){}
  35.                         System.out.println(Thread.currentThread().getName()+"——消费者————"+this.name);
  36.                         flag = false;
  37.                         pro_con.signal();
  38.                 }
  39.                 finally{
  40.                         lock.unlock();
  41.                 }
  42.         }

  43. }

  44. class Pro implements Runnable{
  45.         private Resource r;
  46.         Pro(Resource r){
  47.                 this.r = r;
  48.         }
  49.         public void run(){
  50.                 while(true)
  51.                         r.set("BMW");
  52.         }
  53. }

  54. class Cus implements Runnable{
  55.         private Resource r;
  56.         Cus(Resource r){
  57.                 this.r = r;
  58.         }
  59.         public void run(){
  60.                 while(true){
  61.                         r.out();
  62.                 }
  63.         }
  64. }

  65. class Producer1{
  66.         public static void main(String[] args){
  67.                 Resource r = new Resource();
  68.                 Pro p = new Pro(r);
  69.                 Cus c = new Cus(r);

  70.                 Thread t1 = new Thread(p);
  71.                 Thread t2 = new Thread(c);
  72.                 Thread t3 = new Thread(c);
  73.                 Thread t4 = new Thread(c);

  74.                 t1.start();
  75.                 t2.start();        
  76.                 t4.start();
  77.                 t3.start();
  78.         }
  79. }
复制代码


2014-04-01_091945.jpg (143.36 KB, 下载次数: 22)

2014-04-01_091945.jpg

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

14 个回复

倒序浏览
还照毕老师的代码导过一次,也挂
回复 使用道具 举报
具体代码没有详细去看,不过根据错误提示,编译器找不到ReentrantLock类,所以无法创建该类对象。确实应该是导包的问题,我查了一下帮助文档,Lock和ReentrantLock类都是在java.util.concurrent.locks这个包下面。
你在import java.util.*;这句话下面加上import java.util.concurrent.locks.Lock;和import java.util.concurrent.locks.ReentrantLock;这两句话试试。
或者直接加上import java.util.concurrent.locks.*;试试
如果还报错,在把错误重新贴上来看看再说

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
导入下面这个包就ok
import java.util.concurrent.locks.*;

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
既然用到了Java提供的显示加锁机制,就要导入import java.util.concurrent.locks.*;
然后才能用lock方法获取锁,用unlock方法释放锁。并且你用的可重入锁ReentrantLock也在这个包下,
所以,你导入这个包就行了,你试试看
这个类要使用的包包括
  1. import java.util.*;
  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;
复制代码

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
刘望望 发表于 2014-4-1 12:26
具体代码没有详细去看,不过根据错误提示,编译器找不到ReentrantLock类,所以无法创建该类对象。确实应该 ...

改了改import,很奇怪,“import java.util.concurrent.locks.*;”不是包括了“import java.util.concurrent.locks.Lock;”么,但是有第二句的时候就能通过,没有就通不过。    

回复 使用道具 举报
蒋珍珍 发表于 2014-4-1 14:10
既然用到了Java提供的显示加锁机制,就要导入import java.util.concurrent.locks.*;
然后才能用lock方法获 ...

import java.util.concurrent.locks.*;为什么也不行
回复 使用道具 举报
hyace 发表于 2014-4-1 14:14
import java.util.concurrent.locks.*;为什么也不行

你的代码,我运行了一遍,就是这个包的问题,别的都对。那你再试试把那三个包都导入,
回复 使用道具 举报
蒋珍珍 发表于 2014-4-1 14:24
你的代码,我运行了一遍,就是这个包的问题,别的都对。那你再试试把那三个包都导入, ...

这是我运行的你的程序结果,导入那三个包之后就没问题了
Thread-3——消费者————BMW52026
Thread-0——生产者——BMW52027
Thread-2——消费者————BMW52027
Thread-0——生产者——BMW52028
Thread-1——消费者————BMW52028
Thread-0——生产者——BMW52029
Thread-3——消费者————BMW52029
Thread-0——生产者——BMW52030
。。。。。。
我是在MyEclipse里运行的,你试试,有时候就是比较邪门程序不能正常运行,哈哈,把电脑关了,重新弄:)
回复 使用道具 举报
蒋珍珍 发表于 2014-4-1 14:29
这是我运行的你的程序结果,导入那三个包之后就没问题了
Thread-3——消费者————BMW52026
Thread-0— ...

谢了啊~一点疑惑是,如果只写“import java.util.*;”能不能省了别的?对了,你面试过了没?
回复 使用道具 举报
hyace 发表于 2014-4-1 14:55
谢了啊~一点疑惑是,如果只写“import java.util.*;”能不能省了别的?对了,你面试过了没? ...

面试过了,还没申请入学名额
回复 使用道具 举报
蒋珍珍 发表于 2014-4-1 16:48
面试过了,还没申请入学名额

能問一下筆試面試都什麽題來著么。。。
回复 使用道具 举报
请问这么漂亮的代码格式是怎么上传上去的?
回复 使用道具 举报
一世英明 发表于 2014-4-2 00:03
请问这么漂亮的代码格式是怎么上传上去的?

⊙﹏⊙b插入代码的时候直接复制的啊
回复 使用道具 举报
哦,值得借鉴呢..
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马