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;
}
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;
}
////////////////////////notify();/////////////////////////////////
是不是要我加上这条语句啊?
理由呢?notify谁阿?
试过了,不行。您这一notify有可能把消费者喊醒了,而不是所期望的生产者,而只有这一个消费者是拿到了Job的,其他应该继续睡觉。
用C,可以用PV操作两个semphone很简单的解决掉,但是Java我也是刚学,不会用。
return;
}改为
if (curJobNum >= maxJobNum) {
try {
wait();
}
catch (InterruptedException ex) {
}
}
试试,即生产者阻塞,然后由消费者用notify唤醒
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;
}