class Test{
    private JobDesc jobList[]; 
    private int s_pos, e_pos, maxJobNum, curJobNum; //e_pos points the next 
                                                 //  position of last element.    synchronized public void addJob(JobDesc job) {
        if (curJobNum >= maxJobNum) {
            return;
        }
        jobList[e_pos++] = job;
        e_pos %= maxJobNum;
        ++curJobNum;
        notify();
        return;
    }    synchronized public JobDesc getJob() {
        if (curJobNum <= 0) {
            try {
                wait();
            }
            catch (InterruptedException ex) {
            }
        }
        JobDesc jd = jobList[s_pos++];
        s_pos %= maxJobNum;
        --curJobNum;
////////////////////////notify();//////////////////////////////////////////////////
        return jd;
    }

解决方案 »

  1.   

    什么意思啊?
    ////////////////////////notify();/////////////////////////////////
    是不是要我加上这条语句啊?
    理由呢?notify谁阿?
      

  2.   

    bluesmile979(笑着):
    试过了,不行。您这一notify有可能把消费者喊醒了,而不是所期望的生产者,而只有这一个消费者是拿到了Job的,其他应该继续睡觉。
    用C,可以用PV操作两个semphone很简单的解决掉,但是Java我也是刚学,不会用。
      

  3.   

    if (curJobNum >= maxJobNum) {
                return;
            }改为
    if (curJobNum >= maxJobNum) {
     try {
                    wait();
                }
                catch (InterruptedException ex) {
                }
    }
    试试,即生产者阻塞,然后由消费者用notify唤醒
      

  4.   

    楼上,不行啊。说过了,消费者不一定是唤醒生产者,可能把其他的消费者唤醒了。因为他们都是在同一个context里面阻塞了。我现在要只唤醒生产者。
      

  5.   

    定义俩个同步变量,consumer ,producer.分别对俩个同步变量进行wait()和notify()就可以实现。
      

  6.   

    把你的生产者
    private int s_pos, e_pos, maxJobNum, curJobNum;
    synchronized public void addJob(JobDesc job) {
            if (curJobNum >= maxJobNum) {
                return;
            }
            jobList[e_pos++] = job;
            e_pos %= maxJobNum;
            ++curJobNum;
            notify();
            return;
        }
    改为
    private int s_pos, e_pos;
    private static int maxJobNum, curJobNum;
    synchronized public void addJob(JobDesc job) {
             while (curJobNum >= maxJobNum) {
                wait();
            }
            jobList[e_pos++] = job;
            e_pos %= maxJobNum;
            ++curJobNum;
            notify();
            return;
        }
      

  7.   

    谢谢大家的各种意见了。我最后还是用Semaphore把它解决了。大家说得好像都没有用上。
      

  8.   

    提醒楼主一句:象你这样频繁操作列表的话,不要用数组,用List