黑马程序员技术交流社区
标题:
调用了方法却没输出结果
[打印本页]
作者:
赵学刚
时间:
2012-12-1 23:08
标题:
调用了方法却没输出结果
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class ProductConsumer {
/**
* 需求:通过lock实现生产者消费者多线程同步
思路:创建生成和消费方法,在要同步的代码前用lock对象锁住
* 判断过产品是否为空,为空则生产,否则不生产,唤醒消费者消费,并 解锁,同理消费方法也是先加锁,判断的是否有产品,有则消费,没有则
* 唤醒生产者生产,然后解锁.
*
*
*/
private ProductConsumer p;
private int count = 1;
private boolean flag = false;
private Lock lock = new ReentrantLock();
private Condition condition_pro = lock.newCondition();
private Condition condition_con = lock.newCondition();
public void product() {
lock.lock();
try {
while (flag)
try {
condition_pro.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "生成产品->"
+ count++);
flag = true;
condition_con.signal();
} finally {
lock.unlock();
}
}
public void consumer() {
try {
lock.lock();
while (!flag)
try {
condition_con.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "消费产品->"
+ this.count);
flag = false;
condition_pro.signal();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
new Thread(new ProductConsumer().new Product(new ProductConsumer()))
.start();
new Thread(new ProductConsumer().new Consumer(new ProductConsumer()))
.start();
new Thread(new ProductConsumer().new Product(new ProductConsumer()))
.start();
new Thread(new ProductConsumer().new Consumer(new ProductConsumer()))
.start();
}
class Product implements Runnable {
Product(ProductConsumer pro) {
p = pro;
}
@Override
public void run() {
product();
}
}
class Consumer implements Runnable {
Consumer(ProductConsumer con) {
p = con;
}
@Override
public void run() {
consumer();
}
}
}
如题:为什么我调用了 consumer()方法却没有输出,而且生产者的输出也不对呢,求解。。。。。谢谢
作者:
张其辉
时间:
2012-12-1 23:40
/*这是我按照毕老师视频打出来的,运行正常,希望对你有用
* lock方法和condition的应用
* */
import java.util.concurrent.locks.*;//必须要加上这个包,否则编译错误
public class LockCondition {
public static void main(String[] args) {
Res1 r=new Res1();
Input2 in=new Input2(r);
Output2 out=new Output2(r);
Thread t1=new Thread(in);
Thread t2=new Thread(in);
Thread t3=new Thread(out);
Thread t4=new Thread(out);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Res1
{
private String name;
private int count=1;
private boolean flag=false;
private Lock lock=new ReentrantLock();//创建一个锁对象
private Condition con_c=lock.newCondition();
private Condition con_p=lock.newCondition();
public void set(String name)throws InterruptedException//注意没有同步代码了,但是lock要抛出异常
{
lock.lock();//相当于给程序加了一把锁
try
{
while(flag)
{
con_c.await();
}
this.name=name+count++;
System.out.println(Thread.currentThread().getName()+"..生产者.."+name);
flag=true;
con_p.signalAll();//注意此处为什么不是signal(),这和notify()以及notifyAll()原理一样
}
finally
{
lock.unlock();//解锁,这一步必须要执行,所以在finally中
}
}
public void out()throws InterruptedException
{
lock.lock();//相当于给程序加了一把锁
try
{
while(!this.flag)
{
con_p.await();
}
System.out.println(Thread.currentThread().getName()+"..消费者.."+name);
flag=false;
con_c.signalAll();//注意此处为什么不是signal(),这和notify()以及notifyAll()原理一样
}
finally
{
lock.unlock();//解锁,这一步必须要执行,所以在finally中
}
}
}
class Input2 implements Runnable
{
private Res1 r;
Input2(Res1 r)
{
this.r=r;
}
public void run()
{
while (true)
{
try
{
r.set("商品");
}
catch (InterruptedException e) //处理抛出的异常
{
}
}
}
}
class Output2 implements Runnable
{
private Res1 r;
Output2(Res1 r)
{
this.r=r;
}
public void run()
{
while (true)
{
try
{
r.out();
}
catch (InterruptedException e) //处理抛出的异常
{
}
}
}
}
作者:
赵学刚
时间:
2012-12-2 00:12
嗯 谢谢啦 我参照你的代码把该改的都改了还是一样的结果,暂时没发现主要问题吧,过短时间再看看。。。。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2