【问题标题】:Adding words to an arraylist with concurrently running threads使用并发运行的线程将单词添加到数组列表
【发布时间】:2015-11-10 14:12:22
【问题描述】:

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

public static ArrayList<String> infiList;

我需要在main方法下添加三个并发运行的线程,三个线程要重复向infiList添加单词,规则如下:

1) 在每一次循环中,线程应该在 infiList 中添加一个词。

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

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

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

5) 在任何时候,infiList 都应仅在列表的开头或紧接在出现“infinite”之后包含“This”,“is”应仅出现在列表中紧接在“This”之后,以及“infinite”应该只出现在“is”之后。 infiList 中不允许有其他词。

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

我如何开始这样做,如何创建一个并发运行的线程来将单词添加到数组列表中??

提前致谢

【问题讨论】:

  • 如果你想在 Java 中完整实现线程和其他东西,你应该阅读,我们不是来解决这个问题的。如果您对访问 ArrayList 的线程有疑问,那么我的答案将涵盖它
  • 做一些阅读和开始,如果你不努力,我们无能为力

标签: java multithreading arraylist concurrency


【解决方案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 之后条件可能不再为真。

【讨论】:

  • 这没有回答关于线程排序的问题
  • 我在问题中看不到这一点。如果是这种情况,您建议的副本也是错误的。
  • @EngineerDollery,这个问题没有说明线程排序。无论如何,线程在分配中运行的顺序并不重要,因为它们只是工人:所有三个线程都执行完全相同的任务。
  • OP 想要按顺序使用“This Is Infinite”这个词——问题似乎不是关于线程的简单并发访问
  • @JohnDemetriou 同样。
【解决方案2】:

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

每个线程将简单地检查数组列表中的最后一个单词是什么,然后在其后附加正确的单词

【讨论】:

  • 这并没有回答关于线程排序的问题
  • 这是关于订购线程?线程中没有顺序,每个线程检查列表中的最后一个单词是什么,然后根据它附加正确的下一个单词
  • @EngineerDollery 在问题中并没有说每个线程只负责一个词。不赞成投票
  • @EngineerDollery 也许你是对的,这就是他想要的,但问题中没有说明
猜你喜欢
  • 1970-01-01
  • 2013-05-19
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2015-06-23
相关资源
最近更新 更多