这就是我所拥有的:
public class Queue implements Runnable {
ArrayList<Point> queue;
public Queue(){
this.queue=new ArrayList<Point>();
}
synchronized public void cuePoint(Point p){
this.queue.add(p);
}
synchronized public void doFirstPoint(){
if(queue.size()!=0){
//some operation that takes a real long time
queue.remove(0);
}
}
synchronized public void clearQueue(){
this.queue.clear();
}
public void run() {
while(true){
doFirstPoint();
}
}
}
但是,这段代码的问题在于,如果队列线程正在处理队列中的某个点(如上所述,需要很长时间),那么提示线程将一直等待。有没有一种简单,直观的方法来解决这个问题?
答案 0 :(得分:1)
在java中有一个名为ArrayBlockingQueue的类,它可以完成你想做的事情并且它是线程安全的。
public BlockingQueue<Point> pointQueue = new ArrayBlockingQueue<Point>();
答案 1 :(得分:0)
如果您使用线程安全的Queue实现,那么很多工作已经为您完成。我建议使用ArrayBlockingQueue。唯一具有优点和缺点的细节是实现具有固定的大小,而不像ArrayList那样可以无限增长。
public abstract class AbstractQueuedRunnable<T> extends Thread
{
protected BlockingQueue<T> queue;
public AbstractQueuedRunnable(int maxQueueSize)
{
queue = new ArrayBlockingQueue<T>(maxQueueSize);
}
@Override
public void run()
{
while (true)
{
try
{
T data = queue.take();
doNext(data);
}
catch (Exception e)
{
if (e instanceof InterruptedException)
Thread.currentThread().interrupt();
else
e.printStackTrace();
}
}
}
public void add(T data) throws InterruptedException
{
queue.put(data);
}
protected abstract void doNext(T data) throws Exception;
}