最近,我遇到了一些与线程相关的问题,该问题与需要积分的消费者有关。这是原始版本,除了占用大量cpu不断检查队列外,它工作正常。想法是cuePoint可以随便调用,主线程继续运行。
import java.util.List;
import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class PointConsumer implements Runnable {
public static final int MAX_QUEUE_SIZE=500;
BlockingQueue<Point> queue;
public PointConsumer (){
this.queue=new ArrayBlockingQueue<Point>(MAX_QUEUE_SIZE);
}
public void cuePoint(Point p){
try{
this.queue.add(p);
}
catch(java.lang.IllegalStateException i){}
}
public void doFirstPoint(){
if(queue.size()!=0){
Point p=queue.poll();
//operation with p that will take a while
}
}
public void run() {
while(true){
doFirstPoint();
}
}
}
我尝试通过在每次调用 cue 函数时添加 notify() 来解决 cpu 问题,并将 doFirstPoint() 重新工作为如下所示:
public void doFirstPoint(){
if(queue.size()!=0){
//operation with p that will take a while
}
else{
try{
wait();
}
catch(InterruptedException ie){}
}
}
但是,我发现 notify() 和 wait() 仅适用于同步函数。当我使 doFirstPoint 和 cuePoint 同步时,调用 cuePoint 的主线程将一直等待。
我有一些想法来解决这个问题,包括使线程成为对象并直接通知它,但我不确定这是否会导致比它修复的问题更多、形式非常糟糕或根本不起作用。我缺少这个问题的简单解决方案吗?