Java线程调用公共数据收集器对象上的方法是否可能?
想法:我有一个JAX-RS webservice servlet(称为Java线程调用公共数据收集器对象上的方法是否可能?,java,multithreading,web-services,servlets,jax-rs,Java,Multithreading,Web Services,Servlets,Jax Rs,想法:我有一个JAX-RS webservice servlet(称为webServlet的对象),它实例化一个数据收集对象dataCollector,并将该对象传递给其构造函数中的多个线程。这些线程查询网站的结果,然后调用dataCollector.add(result)方法将结果添加到共享dataCollector中的队列中 关于这个想法,我有两个问题: 1) 多个线程可以同时调用单个共享对象的方法吗 2) 当终止所有线程以呈现结果页时,我的webServlet对象如何检查?我是否必须让我的
webServlet
的对象),它实例化一个数据收集对象dataCollector
,并将该对象传递给其构造函数中的多个线程。这些线程查询网站的结果,然后调用dataCollector.add(result)
方法将结果添加到共享dataCollector
中的队列中
关于这个想法,我有两个问题:
1) 多个线程可以同时调用单个共享对象的方法吗
2) 当终止所有线程以呈现结果页时,我的webServlet
对象如何检查?我是否必须让我的webServlet
在所有线程运行时等待,以便我有一个完整的结果列表,以及我将如何做到这一点?1)是的,但可能不安全。特别是,如果dataCollector中的队列不是线程安全的队列(如),则当线程对其调用add()时,您将面临线程安全的风险
2) a)使用(可能从中获得)至或。保留返回的文件,并用于等待工作完成
b) 你不必这么做。选择权在你。如果您在工作完成之前发送响应,显然您还没有得到完整的结果
c) 见a)
如果这对您来说都是新的,您可能想签出。我的dataCollector不是ConcurrentLinkedQueue,而是一个普通对象,它提供了更多功能,如验证要添加到队列中的数据,这会有问题吗?或者我的对象是线程安全的,因为它使用线程安全队列吗?@Jack:我想说的是,dataCollector中的队列必须是线程安全的,否则你注定会失败。即使是这样,如果您不完全熟悉跨线程共享资源的含义,也可能会得到一些令人惊讶的结果。是的,谢谢您,实际上我遇到了令人惊讶的结果,因为我对跨线程共享资源一点也不熟悉。我在那边问了一个更具体的问题。如果有/没有意义,请告诉我:)