Ani*_*666 0 java multithreading producer-consumer blockingqueue
我最近遇到了一些线程相关的问题,消费者需要积分.这是原始的,除了占用大量的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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试图通过每次调用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){}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现notify()和wait()仅适用于同步函数.当我使doFirstPoint和cuePoint同步时,调用cuePoint的主线程将保持等待状态.
我有一些想法来解决这个问题,包括将线程作为一个对象并直接通知它,但我不确定这是否会导致比修复更多的问题,是非常糟糕的形式,还是根本无法工作.我错过了这个问题的简单解决方案吗?
Jon*_*eet 11
关键BlockingQueue是你不必自己编写这段代码.
只需调用take(),它将等待一个对象插入到队列中,或者使用poll但是超时,以便它只null在超时过去时返回.
编辑:只是澄清答案 - 因为它在评论中 - 这不仅意味着您可以删除等待/通知代码; 您也可以删除大小检查,因为队列会为您执行此操作.
| 归档时间: |
|
| 查看次数: |
4912 次 |
| 最近记录: |