2015-11-10 34 views
0

我创建了一个静态字段类型的ArrayList将单词添加到一个ArrayList并发运行的线程

public static ArrayList<String> infiList; 

我需要补充的主要方法在三个同时运行的线程,三级螺纹应反复单词添加到infiList遵循以下规则:

1)在每个循环中,线程应该只向infiList添加一个单词。 2)如果infiList中的最后一个单词当前是“This”,则线程应该将单词“is”附加到infiList。 3)如果infiList中的最后一个单词当前是“is”,则线程应该向infiList添加单词“infinite”。 4)如果infiList中的最后一个单词当前是“无限”,或者如果infiList仍然是空的,则线程应该向infiList附加单词“This”。 5)在任何时候,infiList只能在列表的开头或者在发生“无限”之后包含“This”,在应该在“This”之后直接出现在列表中,“只有在“是”之后才会出现“无限”。 infiList中不允许有其他词语。例如:经过一段时间后,infiList应包含以下字符串列表:“This”,“is”,“infinite”,“This”,“is”, “infinite”,“This”,“是“,”无限“,”这个“,”是“,”无限“,”这个“,”是“,...

我该如何开始做这个,我该如何做一个并发运行向arraylist添加单词的线程?

在此先感谢

+1

如果你想在Java中完全实现线程和东西,你应该阅读,我们不是在这里解决这个问题。如果你访问ArrayList的线程有问题,那么我的答案涵盖了 –

+0

做一些阅读和开始,如果你不努力,我们不会帮助 –

回答

1

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

而且每个线程都只是检查什么的ArrayList中的最后一个字,然后附加适当的一个后

+0

这不会回答问题,这是关于订购线程 –

+0

这是关于订购线程?在线程中没有任何顺序,每个线程检查列表中最后一个单词的内容,然后附加适当的下一个单词,具体取决于 –

+0

@EngineerDollery的问题,它并不是说每个线程只负责一个单词。 Downvote undeled for –

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,因为你描述的一样:“如果某个值在列表中,则添加的东西”的逻辑。你需要独占访问列表中的获取和添加列表,否则条件可能在获取后不再成立。

+0

这个没有回答这个问题,这是关于线程的问题 –

+0

I在问题中没有看到。如果是这种情况,您的建议副本也是错误的。 –

+1

@EngineerDollery,这个问题没有提到任何关于线程排序的问题。无论如何,线程在分配中运行的顺序并不重要,因为它们只是工作者:所有三个线程都执行完全相同的任务。 –

相关问题