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
Java 线程与创建它的对象通信的首选方式是什么?_Java_Multithreading - Fatal编程技术网

Java 线程与创建它的对象通信的首选方式是什么?

Java 线程与创建它的对象通信的首选方式是什么?,java,multithreading,Java,Multithreading,我有一个创建10个线程的对象。 该对象有一个用户集合。 这些线程中的每一个都可以检查特定用户是否存在,或者从集合中添加/删除用户 我想知道我应该如何实现这种沟通 我应该通过构造函数或线程内部的方法将用户集合传递到每个线程中吗 我应该将主对象传递到每个线程中,以便它们可以访问对象的属性吗?或者在主对象中有特定的方法来处理线程将调用的用户集合 我不确定在这种情况下什么是最佳实践。据我的理解是正确的,您需要一个线程安全的结构,以便任何线程都可以添加和删除用户。我建议您使用java.util.concu

我有一个创建10个线程的对象。 该对象有一个用户集合。 这些线程中的每一个都可以检查特定用户是否存在,或者从集合中添加/删除用户

我想知道我应该如何实现这种沟通

我应该通过构造函数或线程内部的方法将用户集合传递到每个线程中吗

我应该将主对象传递到每个线程中,以便它们可以访问对象的属性吗?或者在主对象中有特定的方法来处理线程将调用的用户集合


我不确定在这种情况下什么是最佳实践。

据我的理解是正确的,您需要一个线程安全的结构,以便任何线程都可以添加和删除用户。我建议您使用
java.util.concurrent.CopyOnWriteArrayList
,它应该包含用户。应该是这样的

CopyOnWriteArrayList<User> copwl = new CopyOnWriteArrayList<>();
CopyOnWriteArrayList copwl=new CopyOnWriteArrayList();
这里用户是一个对象


如果需要,可以将上述列表传递给线程。

如果希望将用户对象保持在线程安全的数据结构中,这将确保线程在添加/删除用户对象期间不会遇到任何争用条件

您应该看看java提供的。您还可以使用通过
collection获得的标准java集合的同步版本


可以将该数据结构传递到每个线程的构造函数中,这样您就可以访问每个线程中的集合。

是的,您可以传递线程的构造函数。你可以写小线程程序来检查。好的。如果我需要通知创建线程的对象做一些事情,那么可以将对象引用传递到每个线程中,以便它们可以调用其(创建线程的对象)方法吗?我不确定你是否理解meI无法理解你在上述评论中所说的内容。作为补充说明,如果你对列表的迭代次数多于对列表的写入次数,则最好使用
CopyOnWriteArrayList
,如果你要创建和编写很多新用户,你可能想考虑一种不同类型的Obji,我需要一个线程安全结构。但这不是问题所在。我要问的基本上是:A:将结构传递给线程,或者B:将结构声明为public并将整个对象传递给线程,然后线程可以执行如下操作:
this.parentObject.users.add(…)
。我特别问B是否可以,如果以后某个时候我需要使用其他对象的结构,那么将每个结构传递给线程可能是一种不好的做法?好的,如果我理解正确,你会问是否最好通过构造函数将数据结构传递给每个线程(a)或者您是否应该只允许他们通过声明数据结构为公共或使用getter方法来访问数据结构(B)?我想这取决于你对项目未来发展方向的看法。是的,如果您认为需要访问父类中的许多集合,那么最好使用public/getter结构(选项B)。