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
部分。