黑马程序员技术交流社区
标题:
多线程-生产者消费者的问题
[打印本页]
作者:
optimisticpig
时间:
2014-4-14 22:18
标题:
多线程-生产者消费者的问题
import java.util.concurrent.locks.*;
class ProducerConsumerDemo2
{
public static void main(String[] args)
{
Resource res = new Resource();
Producer pro = new Producer(res);
Consumer con = new Consumer(res);
Thread t1 = new Thread(pro);
Thread t2 = new Thread(pro);
Thread t3 = new Thread(con);
Thread t4 = new Thread(con);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Resource
{
private String name;
private int count = 1;
private boolean flag = false;
//多态。创建锁。
private Lock lock = new ReentrantLock();
//调用lock的newCondition方法,获得condition对象。
private Condition condition = lock.newCondition();
public void set(String name)throws InterruptedException
{
lock.lock();
try
{
while(flag)
condition.await();//等待状态。
this.name = name+"---"+count++;
System.out.println(Thread.currentThread().getName()+"---消费者---"+this.name);
flag = true;
condition.signalAll();//唤醒线程。
}
finally
{
lock.unlock();
}
}
public void out()throws InterruptedException
{
lock.lock();
try
{
while(!flag)
condition.await();
System.out.println(Thread.currentThread().getName()+"---生产者---"+this.name );
flag = false;
condition.signalAll();
}
finally
{
lock.unlock();
}
}
}
class Producer implements Runnable
{
private Resource res;
Producer(Resource res)
{
this.res = res;
}
public void run()
{
while(true)
{
try
{
res.set("|商品|");
}
catch (InterruptedException e)
{
}
}
}
}
class Consumer implements Runnable
{
private Resource res;
Consumer(Resource res)
{
this.res = res;
}
public void run()
{
while (true)
{
try
{
res.out();
}
catch (InterruptedException e)
{
}
}
}
}
复制代码
编译时产生6个问题。
-------------------------------------------------------
ProducerConsumerDemo2.java:32: 不兼容的类型
找到: java.util.concurrent.locks.ReentrantLock
需要: Lock
private Lock lock = new ReentrantLock();
^
ProducerConsumerDemo2.java:34: 找不到符号
符号: 方法 newCondition()
位置: 类 Lock
private Condition condition = lock.newCondition();
^
ProducerConsumerDemo2.java:38: 找不到符号
符号: 方法 lock()
位置: 类 Lock
lock.lock();
^
ProducerConsumerDemo2.java:50: 找不到符号
符号: 方法 unlock()
位置: 类 Lock
lock.unlock();
^
ProducerConsumerDemo2.java:55: 找不到符号
符号: 方法 lock()
位置: 类 Lock
lock.lock();
^
ProducerConsumerDemo2.java:66: 找不到符号
符号: 方法 unlock()
位置: 类 Lock
lock.unlock();
^
6 错误
-------------------------------------------------
但是把import java.util.concurrent.locks.*;
换成:import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition;
就没有问题。
这时什么原因呢?
作者:
呆呆沙师妹
时间:
2014-4-15 09:13
两种导入包的方式没有差别呀,没出现你说的编译问题。
作者:
optimisticpig
时间:
2014-4-15 20:28
呆呆沙师妹 发表于 2014-4-15 09:13
两种导入包的方式没有差别呀,没出现你说的编译问题。
我用的是Editplus编译运行的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2