Недавно у меня возникли проблемы, связанные с потоками, с потребителем, который получает очки.Вот оригинал, который отлично работает, за исключением того, что он постоянно загружает процессор, проверяя очередь.Идея заключается в том, что 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();
}
}
}
Я пытался исправить проблему с процессором, добавляя notify () каждый раз, когда вызывается функция cue, и снова работая с 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, будет продолжать ждать.
У меня было несколько идей, чтобы обойти это, в том числе сделать поток объектом и сделать так, чтобы он был уведомлен напрямую, ноЯ не был уверен, вызовет ли это больше проблем, чем исправит, будет очень плохим тоном или просто не сработает.Есть ли простое решение этой проблемы, которое мне не хватает?