从arrayList和函数插入中删除线程

xwh*_*hyz 1 java collections multithreading arraylist

作为标题状态我有基于线程的结构的问题.我需要做的是:

  • 一个线程在循环中运行并检查列表中是否存在某些内容,如果是,则对对象执行某些操作,然后将其从列表中删除

  • 从"外部"调用并将新对象添加到此列表的函数.

这是我的方法:

public class Queue implements Runnable {
    private List<X> listOfObjects = new ArrayList<X>;

    public void addToList(X toAdd){
        listOfObject.add(toAdd);
    }

    public void run() {
        while(true){
            synchronized(listOfObjects){
            if(!listOfObjects.isEmpty()){
                listOfObjects.get(0).doSth();
                listOfObjects.remove(0);
            }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?我是否还要同步添加到此列表?

Bri*_*new 9

看起来你应该尝试java.util.concurrent.BlockingQueue的实现,而不是尝试自己编写!我怀疑LinkedBlockingQueue可以很好地为你工作.您可以从多个源写入队列中的条目,并且您的使用者线程将以线程安全的方式关闭每个条目并依次处理它.

请注意,您的消费者线程BlockingQueue等待(通过调用该take()方法).但是,上面的实现将在等待队列中的条目处理时旋转并消耗CPU(如果运行它并监视CPU使用情况,这应该很明显).

这是一篇解释性文章.