通过并发运行的线程向arraylist添加单词

时间:2015-11-10 14:12:23

标签: java multithreading arraylist concurrency

我创建了一个类型为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添加单词?

提前致谢

2 个答案:

答案 0 :(得分:1)

你应该创建一个同步对象。在访问ArrayList之前,每个线程都应该在访问arrayList之前调用synchronized(syncObject){//code will go here},而不会发生数据争用事件。

每个帖子只会检查arraylist中的最后一个单词是什么,然后在那之后添加正确的单词

答案 1 :(得分:1)

正如Javadoc for ArrayList所说:

  

请注意,此实现未同步。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须在外部进行同步。 (结构修改是添加或删除一个或多个元素的任何操作,或显式调整后备数组的大小;仅设置元素的值不是结构修改。)

您可以在ArrayList本身进行同步:

synchronized (infiList) {
  // ... Whatever logic to make structural modifications to the list.
  // e.g. infiList.add(something);
}

请注意,您不应使用Collections.synchronizedList(...)来包装infiList,因为您描述了“如果值在列表中,然后添加内容”之类的逻辑。你需要对get和add这里的列表进行独占访问,否则在get之后条件可能不再是真的。