Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从arrayList中删除线程和插入函数_Java_Multithreading_Collections_Arraylist - Fatal编程技术网

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

Java 从arrayList中删除线程和插入函数,java,multithreading,collections,arraylist,Java,Multithreading,Collections,Arraylist,正如标题所述,我对基于线程的结构有问题。我需要做的是: 一个线程在循环中运行,检查列表中是否存在某些内容,若存在,则对该对象执行一些操作,然后将其从列表中删除 从“外部”调用并将新对象添加到此列表的函数 我的做法如下: public class Queue implements Runnable { private List<X> listOfObjects = new ArrayList<X>; public void addToList(X to

正如标题所述,我对基于线程的结构有问题。我需要做的是:

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

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

我的做法如下:

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);
            }
            }
        }
    }
}
公共类队列实现可运行{
私有列表listOfObjects=新的ArrayList;
公共无效添加列表(X到添加){
添加(toAdd)对象列表;
}
公开募捐{
while(true){
已同步(列表对象){
如果(!listOfObjects.isEmpty()){
get(0.doSth();
删除对象列表(0);
}
}
}
}
}

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

看起来您应该尝试的实现,而不是尝试编写自己的!我想a对你会很好。您可以从多个源向队列中写入条目,并且您的使用者线程将取下每个条目,并以线程安全的方式依次处理它

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


以下是。

看起来您应该尝试的实现,而不是尝试编写自己的!我想a对你会很好。您可以从多个源向队列中写入条目,并且您的使用者线程将取下每个条目,并以线程安全的方式依次处理它

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


以下是。

您需要同步对列表的所有访问:

public void addToList(X toAdd){
    synchronized(listOfObject) {
        listOfObject.add(toAdd);
    }
}
或者,您可以使用这样一个列表的线程安全实现,在这种情况下,您可以删除所有
synchronized


ps:如另一个答案中所述,您似乎正在重新实现一个。您需要同步对列表的所有访问:

public void addToList(X toAdd){
    synchronized(listOfObject) {
        listOfObject.add(toAdd);
    }
}
或者,您可以使用这样一个列表的线程安全实现,在这种情况下,您可以删除所有
synchronized


ps:正如在另一个答案中提到的,您似乎正在重新实现一个。

最好使用
集合.synchronizedList()
包装,而不是手动同步的块。

最好使用
集合.synchronizedList()
包装,而不是手动同步的块。

您似乎正在尝试为线程创建队列,以处理添加的元素

更简单的方法是使用ExecutorService

ExecutorService service = Executors.newSingleThreadedPool();

// to add a task.
service.submit(new Runnable() {
    public void run() {
       // process X here
    }
});

您似乎正在尝试为线程创建一个队列来处理添加的元素

更简单的方法是使用ExecutorService

ExecutorService service = Executors.newSingleThreadedPool();

// to add a task.
service.submit(new Runnable() {
    public void run() {
       // process X here
    }
});

如果我有很长的队列要处理,会发生什么?在处理所有元素之前是否阻止添加新元素?您可以在构造函数中指定大小,然后在队列已满时阻止生产者。这就是所谓的有界队列。我认为,您可以通过阻塞队列的一些实现来配置它。寻找example@xwhyz阅读链接的javadocs,特别是
LinkedBlockingQueue
中关于容量的部分。如果我有很长的队列要处理,会发生什么?在处理所有元素之前是否阻止添加新元素?您可以在构造函数中指定大小,然后在队列已满时阻止生产者。这就是所谓的有界队列。我认为,您可以通过阻塞队列的一些实现来配置它。寻找example@xwhyz阅读链接的javadocs,特别是容量方面的
LinkedBlockingQueue
部分。