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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 顾传文 中级黑马   /  2013-3-7 12:00  /  916 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Resource{
        private String name;
        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 set(String name) throws InterruptedException{
                lock.lock();
                try{
                        while(flag){
                                condition_pro.wait();
                        }
                        System.out.println("生产者"+name+count);
                        this.name = name+"_"+count++;
                        flag = true;
                        condition_con.signal();
                }finally{
                        lock.unlock();
                }
        }
        public void get() throws InterruptedException{
                lock.lock();
                try{
                        while(!flag){
                                condition_con.wait();
                        }
                        System.out.println("消费者"+"-------------------"+name);
                        flag = false;
                        condition_pro.signal();
                }finally{
                        lock.unlock();
                }
        }
}
class Producer implements Runnable{
        private Resource rs;
        public Producer(Resource rs){
                this.rs = rs;
        }
        @Override
        public void run() {
                while(true){
                        try {
                                rs.set("产品");
                        } catch (InterruptedException e) {
                                //e.printStackTrace();
                        }
                }
        }
}
class Consumer implements Runnable{
        private Resource rs;
        public Consumer(Resource rs){
                this.rs = rs;
        }
        @Override
        public void run() {
                while(true){
                        try {
                                rs.get();
                        } catch (InterruptedException e) {
                                //e.printStackTrace();
                        }
                }
        }
}
public class ProducerConsumer {
        public static void main(String[] args) {
                Resource resource = new Resource();
                new Thread(new Producer(resource)).start();
                new Thread(new Consumer(resource)).start();
                new Thread(new Producer(resource)).start();
                new Thread(new Consumer(resource)).start();
        }

}
运行时报异常,怎么解决?

1 个回复

倒序浏览
condition_con.await();
condition调用的是await()

                try{
                        while(flag){
                                condition_pro.wait();      //这个地方                  }
                        System.out.println("生产者"+name+count);
                        this.name = name+"_"+count++;
                        flag = true;
                        condition_con.signal();
                }finally{
                        lock.unlock();
                }
                try{
                        while(!flag){
                               condition_con.wait();       //这个地方                 }
                        System.out.println("消费者"+"-------------------"+name);
                        flag = false;
                        condition_pro.signal();
                }finally{
                        lock.unlock();
                }

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