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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 梁清平 于 2012-5-28 12:54 编辑

这个程序不能运行还有哪些问题啊?请高手指点。。
//生产者和消费者的示例
import java.util.concurrent.locks .*;
//主线程
public class ConsumerProducerDemo
{
        public static void main(String[] args)
        {
                Products p = new Products();
                new Thread(new Producer(p)).start();
                new Thread(new Producer(p)).start();
                new Thread(new Consumer(p)).start();
                new Thread(new Consumer(p)).start();
        }
}
//定义一个产品类
class Products
{
        private ReentrantLock lock = new ReentrantLock();
        Condition condition_pro = lock.newCondition();
        Condition condition_con = lock.newCondition();
        private String name;
        private int count;
        private boolean flag;
        public void input(String name)
        {
                lock.lock();
                try
                {                        
                        while(flag)
                        {
                                try
                                {
                                        condition_pro.await();
                                }
                                catch(InterruptedException e)
                                {
                                        System.out.println("线程唤醒异常!");
                                }                                
                        }
                        this.name = name+"---:"+count++;
                        System.out.println(Thread.currentThread().getName()+"..."+this.name);
                }
               
                finally
                {
                        lock.unlock();
                }
                flag = true;
                condition_con.signal();               
        }
        public void output()
        {
                lock.lock();
                try
                {
                        while(!flag)
                        try
                        {
                                condition_con.await();
                        }
                        catch(InterruptedException e)
                        {
                                System.out.println("线程唤醒异常!");
                        }
                        System.out.println(Thread.currentThread().getName()+"!!!!!!"+this.name);
                }               
                finally
                {
                        lock.unlock();
                }
                flag = false;
                condition_pro.signal();
               
        }

}

//定义两个线程类
class Producer implements Runnable
{
        private Products p;
        Producer(Products p)
        {
                this.p = p;
        }
        public void run()
        {
                while(true)
                p.input("产品");
               
        }
}

class Consumer implements Runnable
{
        private Products p;
        Consumer(Products p)
        {
                this.p = p;
        }
        public void run()
        {
                while(true)
                p.output();
        }
}

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

1 个回复

正序浏览
本帖最后由 黑马-唐磊 于 2012-5-28 13:25 编辑

你那个标记唤醒出了问题
   flag=true;
condition_con.signal();你定义在finally之后,当finally一执行后面的代码就不执行了,也就不会唤醒,所以出现了非法监视状态异常。我给你修改了一下,下面就能正常运行
import java.util.concurrent.locks .*;
//主线程
public class Demo10
{
        public static void main(String[] args)
        {
                Products p = new Products();
                new Thread(new Producer(p)).start();
                new Thread(new Producer(p)).start();
                new Thread(new Consumer(p)).start();
                new Thread(new Consumer(p)).start();
        }
}
//定义一个产品类
class Products
{
        private ReentrantLock lock = new ReentrantLock();
        Condition condition_pro = lock.newCondition();
        Condition condition_con = lock.newCondition();
        private String name;
        private int count;
        private boolean flag;
        public void input(String name)
        {
                lock.lock();
                try
                {                        
                        while(flag)
                        {
                                try
                                {
                                        condition_pro.await();
                                }
                                catch(InterruptedException e)
                                {
                                        System.out.println("线程唤醒异常!");
                                }                                
                        }
                        this.name = name+"---:"+count++;
                        System.out.println(Thread.currentThread().getName()+"..."+this.name);
                        flag=true;
                        condition_con.signal();
                }
               
               finally
                {
                        lock.unlock();
                }
                           
       }
        public void output()
        {
                lock.lock();
                try
                {
                        while(!flag)
                        try
                        {
                                condition_con.await();
                        }
                        catch(InterruptedException e)
                        {
                                System.out.println("线程唤醒异常!");
                        }
                        System.out.println(Thread.currentThread().getName()+"!!!!!!"+this.name);
                        flag = false;
                        condition_pro.signal();
                }               
               finally
                {
                        lock.unlock();
                }
               
       }
}
//定义两个线程类
class Producer implements Runnable
{
        private Products p;
        Producer(Products p)
        {
                this.p = p;
        }
        public void run()
        {
                while(true)
                p.input("产品");
               
       }
}
class Consumer implements Runnable
{
        private Products p;
        Consumer(Products p)
        {
                this.p = p;
        }
        public void run()
        {
                while(true)
                p.output();
        }
}

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

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