我创建了一个类型为ArrayList的静态字段

public static ArrayList<String> infiList;


我需要在main方法下添加三个同时运行的线程,这三个线程应使用以下规则向infiList重复添加单词:

1)在每次循环传递中,线程应在infiList中恰好添加一个单词。

2)如果infiList中的最后一个单词当前为“ This”,则线程应将单词“ is”附加到infiList中。

3)如果infiList中的最后一个单词当前为“ is”,则线程应在infiList后面附加单词“ infinite”。

4)如果infiList中的最后一个单词当前为“无限”,或者infiList仍然为空,则线程应在infiList后面附加单词“ This”。

5)任何时候,infiList都应仅在列表的开头或紧接出现“ infinite”之后才包含“ This”,“ is”应仅在“ This”和“ infinite”之后紧随其后出现在列表中应该仅在“是”之后直接发生。 infiList中不允许使用其他词。

例如:过一会儿,infiList应该包含以下字符串列表:“ This”,“ is”,“ infinite”,“ This”,“ is”,
“无限”,“这个”,“是”,“无限”,“这个”,“是”,“无限”,“这个”,“是”,...

如何开始执行此操作,如何创建同时运行的线程以将单词添加到arraylist?

提前致谢

最佳答案

正如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的列表的独占访问权限,因为否则获取后的条件可能就不再成立。

关于java - 使用并行运行的线程将单词添加到arraylist,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33631968/

10-09 18:55