我创建了一个类型为ArrayList的静态字段
public static ArrayList<String> infiList;
我需要在main方法下添加三个并发运行的线程,三个线程应该使用以下规则重复向infiList添加单词:
1)在每个循环传递中,线程应该只向infiList添加一个单词。
2)如果infiList中的最后一个单词当前是“This”,则该主题应该将单词“is”附加到infiList。
3)如果infiList中的最后一个单词当前是“是”,则该主题应该将单词“infinite”附加到infiList。
4)如果infiList中的最后一个单词当前是“无限”,或者如果infiList仍为空,则该主题应该将单词“This”附加到infiList。
5)任何时候,infiList只应在列表的开头包含“This”,或者在“无限”发生后直接包含“This”,“is”应该只在“This”之后直接出现在列表中,并且“无限”应该只在“是”之后直接出现。 infiList中不允许使用其他单词。
例如:一段时间后,infiList应包含以下字符串列表:“This”,“is”,“infinite”,“This”,“is”, “无限”,“此”,“是”,“无限”,“此”,“是”,“无限”,“此”,“是”,......
如何开始这样做,如何创建一个同时运行的线程,为arraylist添加单词?
提前致谢
答案 0 :(得分:1)
你应该创建一个同步对象。在访问ArrayList之前,每个线程都应该在访问arrayList之前调用synchronized(syncObject){//code will go here}
,而不会发生数据争用事件。
每个帖子只会检查arraylist中的最后一个单词是什么,然后在那之后添加正确的单词
答案 1 :(得分:1)
请注意,此实现未同步。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须在外部进行同步。 (结构修改是添加或删除一个或多个元素的任何操作,或显式调整后备数组的大小;仅设置元素的值不是结构修改。)
您可以在ArrayList
本身进行同步:
synchronized (infiList) {
// ... Whatever logic to make structural modifications to the list.
// e.g. infiList.add(something);
}
请注意,您不应使用Collections.synchronizedList(...)
来包装infiList
,因为您描述了“如果值在列表中,然后添加内容”之类的逻辑。你需要对get和add这里的列表进行独占访问,否则在get之后条件可能不再是真的。