最近、ポイントを取るコンシューマでスレッド関連の問題が発生しています。これはオリジナルで、常にキューをチェックして大量の 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() を追加し、doFirstPoint() を次のように作り直すことで、CPU の問題を修正しようとしました。
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 を呼び出したメイン スレッドが待機状態になります。
スレッドをオブジェクトにして直接通知するなど、これを回避するためのいくつかのアイデアがありましたが、それが修正されるよりも多くの問題を引き起こすか、非常に悪い形になるか、単に機能しないかはわかりませんでした. 私が見逃しているこの問題の簡単な解決策はありますか?