首页 > 解决方案 > 同时从列表中添加和删除元素

问题描述

我想创建两个线程,一个将元素添加到 ArrayList (或向量)中,另一个同时从该列表中删除元素。例如,如果thread1将 20 个元素添加到列表中,则thread2同时开始删除,直到删除全部元素,但这两个线程必须同时工作。

我写了一个生产者(添加到列表)线程。在这个线程中,当添加到列表中的元素数量大于 5 或​​任何数量时,必须启动新线程但在这里我被卡住了。我会标记我被卡住的地方。

public class Test{

public static void main(String[] args) {

    Data d = new Data();
    Thread t = new Thread(new producer(d));
    t.start();
}

}
class producer implements Runnable{

Data d;
Data d2;
Object lck;

public producer(Data dd)
{
    d=dd;
}
@Override
public void run()
{
    for (int i=0;i<100;++i ) {
        synchronized (d){
            d.a.add(i);
            // if i is greater than 5,
            // start consumer thread 
            // which remove elements from ArrayList.
            // but how ??
            Thread t = new Thread(new Runnable(){
                @Override
                public void run()
                {
                    //if(d.a.isEmpty())
                    //wait the adder thread 
                }
            });
            t.start();      
        }
    }
}

}
class Data{
  ArrayList<Integer> a; // or vector
  public Data()
  {
      a = new ArrayList<>();
  } 
}

如何实现一个移除器线程,该移除器线程与加法器线程同时移除列表中的所有元素并同步它们?

标签: javamultithreading

解决方案


You can try concurrent package of java . https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

You are using synchronized block in thread which will not help in this case. Method in collection or shared data should be synchronized as it will be accessed by multiple thread


推荐阅读