Java:如何将一个线程添加到队列中,另一个线程使用线程对其进行操作?

时间:2011-03-04 00:55:08

标签: java multithreading

这就是我所拥有的:

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();
        }
    }
}

但是,这段代码的问题在于,如果队列线程正在处理队列中的某个点(如上所述,需要很长时间),那么提示线程将一直等待。有没有一种简单,直观的方法来解决这个问题?

2 个答案:

答案 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;
}