java - 同时从列表中添加和删除元素
问题描述
我想创建两个线程,一个将元素添加到 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<>();
}
}
如何实现一个移除器线程,该移除器线程与加法器线程同时移除列表中的所有元素并同步它们?
解决方案
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
推荐阅读
- unit-testing - 如何断言 Go 测试中的错误类型?
- curl - 跟踪所有重定向的最佳工具,包括元刷新/javascript重定向?
- python - For循环问题
- logstash - 无法找到请求的目标 logstash 的有效证书路径
- android - 我无法将 Firebase admin sdk 添加到项目中
- php - 如何生成多个pdf文件
- django - 如何限制 ForeignKey/ManyToMany Wagtail ModelAdmin 字段中显示的项目?
- javascript - 如何在 HTML 中嵌入我的处理草图
- python - 在图形上绘制多个图形时避免 for 循环
- machine-learning - 作为多类分类的问答的损失函数?