Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用并发运行的线程向arraylist添加单词_Java_Multithreading_Arraylist_Concurrency - Fatal编程技术网

Java 使用并发运行的线程向arraylist添加单词

Java 使用并发运行的线程向arraylist添加单词,java,multithreading,arraylist,concurrency,Java,Multithreading,Arraylist,Concurrency,我已经用ArrayList类型创建了一个静态字段 public static ArrayList<String> infiList; publicstaticarraylistinfilist; 我需要在main方法下添加三个并发运行的线程,这三个线程应该按照以下规则重复向infiList添加单词: 1) 在每个循环过程中,线程应该向infiList添加一个单词 2) 如果内嵌列表中的最后一个单词当前为“This”,则线程应将单词“is”附加到内嵌列表中 3) 如果infiLis

我已经用ArrayList类型创建了一个静态字段

public static ArrayList<String> infiList;
publicstaticarraylistinfilist;
我需要在main方法下添加三个并发运行的线程,这三个线程应该按照以下规则重复向infiList添加单词:

1) 在每个循环过程中,线程应该向infiList添加一个单词

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

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

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

5) 在任何时候,内嵌列表应仅在列表开头或出现“无限”后直接包含“This”,“is”应仅在列表中出现在“This”之后,而“无限”应仅在“is”之后直接出现。infiList中不允许使用其他单词

例如:一段时间后,infiList应该包含以下字符串列表:“This”、“is”、“infinite”、“This”、“is”, “无限”、“这个”、“是”、“无限”、“这个”、“是”、“无限”、“这个”、“是”

如何开始这样做,如何创建一个并发运行的线程,将单词添加到arraylist


提前感谢

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

每个线程只需检查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之后,条件可能不再为真。

如果您希望在Java中完整实现线程和其他内容,您应该仔细阅读,我们不是来解决这个问题的。如果你对线程访问ArrayList有问题,那么我的回答是:阅读并开始,如果你不努力,我们就帮不了你。这并没有回答问题,这是关于线程排序的问题。这是关于线程排序的问题?线程中没有顺序,每个线程检查列表中的最后一个单词是什么,然后根据需要追加正确的下一个单词that@EngineerDollery在这个问题中,它并没有说每个线程只负责一个单词。不必要的否决票for@EngineerDollery也许你是对的,这正是他想要的,但问题中没有说明这并没有回答问题,这是关于线程排序的问题,我在问题中没有看到这一点。如果是这样的话,您建议的复制品也是错误的。@EngineerDollery,这个问题并没有说明线程顺序。不管怎么说,分配中线程的运行顺序并不重要,因为它们只是工作线程:所有三个线程都执行完全相同的任务。OP希望用“这是无限的”这个词来排序——问题似乎不是简单的并发访问threads@JohnDemetriou同样地