通过多个线程使用的java集合进行复制



我有一个名为qute的java进程,它独立地运行在linux服务器1和服务器2上。

该qute进程用于使用Spring Rmi创建一个QuotingThread,并在该线程中更新"quotableSet"集合和带有一组符号的PriorityBlockingQueue"addSymQ"。

<bean id="quotes-core" class="com.process.quotes.QuotesHandler" scope="singleton" init-method="init">
<constructor-arg>
<bean id="continuousQuotingThread" class="com.process.quotes.QuotingThread" scope="singleton" >
<property name="futureTaskUtil" ref="futureTaskUtil" />
<property name="continueToProcess" ref="continueToProcess" />
<property name="addSymQ" ref="addSymQ" />
</bean>
</constructor-arg>
</bean>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="Quotes-Core" />
<property name="service" ref="quotes-core" />
<property name="serviceInterface" value="com.remote.QuotesHandlerIF" />
<property name="registryPort" value="${${quotes-processor-port}}" />
</bean>

QuotingThread根据以这种方式配置的QuotesClient中的符号更新"quotableSet"one_answers"addSymQ"。

<bean id="quotes" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://${${quotes-processor-host}}:${${quotes-processor-port}}/Quotes-Core" />
<property name="serviceInterface" value="com.remote.QuotesHandlerIF" />
<property name="refreshStubOnConnectFailure" value="true" />
<property name="lookupStubOnStartup" value="false" />
</bean>

由于每个报价过程使用Spring Rmi创建2个独立的报价线程,

例如,符号a、b、c通过引号处理1添加到"quotableSet"、"ddSymQ",符号e、f、g通过引号处理2添加到"quotableSet"one_answers"ddSymQ'"。

加法就是这样做的。

QuotingThread:
--------------------------------
public void addSymbols(String commaDelimSymbolsList) {
if (null != commaDelimSymbolsList && commaDelimSymbolsList.length() > 0) {
String[] symAr = commaDelimSymbolsList.split(",");
for (int i = 0; i < symAr.length; i++) {
addSymQ.add(sec.getUniqueSymbol());             
}
}
}
public void run() {
while (continueToProcess.get()) {
try {
while (addSymQ.peek() != null) {
String symbol = addSymQ.poll();
quotableSet.add(symbol);                    
// some usage with quotable set                                         
}
Iterator<String> ite = quotableSet.iterator();
while (ite.hasNext()) {
String symbol = ite.next();
if (symbol != null && symbol.trim().length() > 0) {
// some usage with quotable set 
}
}
Thread.sleep(2000);
} catch (Exception e) {
logger.error("Exception : ", e);
}
}
}

"quotableSet"one_answers"addSymQ"是这样声明的,

private Set<String> quotableSet = Collections.synchronizedSet(new HashSet<String>(Arrays.asList("DJ!DJI,NQ!COMP,CX!SPX,RU!RUT,CX!VIX,CX!TNX");


private PriorityBlockingQueue<String> addSymQ;

我需要的是符号应该在线程的"quotableSet"one_answers"addSymQ"集合上复制。

我的意思是,符号a、b、c、e、f、g应该平等地添加到线程"quotableSet"one_answers"addSymQ"集合中。

因此,如果一台服务器出现故障,第二台服务器就可以为应用程序提供服务器服务。。

有人能在这个问题上帮我吗?

让我看看我是否正确理解了这一点。

您有两个服务器,每个服务器运行一个报价流程实例。报价过程中有两个线程为这些集合提供服务。现在我感到困惑的是,你说"应该在线程的‘quotableSet’和‘addSymQ’集合上复制",这是否意味着你想在报价过程中的两个线程之间共享集合?如果是这样的话,这比我从中得到的要容易得多——"如果一台服务器坏了,第二台服务器可以为应用程序提供服务器",这表明你希望在两台服务器之间同步集合,而不是在两个线程之间同步。

还是您要求同步线程和进程?或者,只要集合本身在服务器上复制,两个线程在集合中是否会有不同的值?

以下是关于每个的一些提示:

1) 跨线程同步。只需在两个线程之间的共享资源中提供集合,即可确保已同步集合。就这样。

2) 跨进程同步。您需要在两个进程之间建立某种连接,比如套接字,以便它们发送和接收彼此的集合值。这将需要在报价过程中增加一个线程来处理此问题。

祝你好运。

最新更新