【发布时间】:2018-10-07 10:17:26
【问题描述】:
我有一个要遍历的列表,并且要为列表中的每个值调用一个方法。现在我已经将相关方法放在一个线程中,并使用执行器服务来并行处理这些方法。但是,对于列表中的每个值,由于某种原因,该方法最终会被调用两次。
ExecutorService service = Executors.newFixedThreadPool(NUMBER_OF_THREADS);
for (RData rData : rDataList) {
service.execute(new RDataUpdaterThread(rData,this.rDataProcessorGroup));
}
service.shutdown();
if (!service.awaitTermination(THREAD_WAIT_TIME, TimeUnit.SECONDS)) {
service.shutdownNow();
}
if(service.isTerminated()){
if (isLockObtained) {
try {
rDataFetchLock.release(lockName);
isLockObtained = false;
} catch (FatalException e) {
e.printStackTrace();
}
}
}
对于列表中的每个值,RDataUpdaterThread() 的 run() 块内的代码将被执行两次。 run() 块没有任何循环。
谁能告诉我在实施 Executor 服务的方式中可能存在的问题?
编辑:
public class RDataUpdaterThread implements Runnable {
private RData rData;
private Thread RDataUpdaterThread;
Session session;
boolean postToQueue = false;
public RDataUpdaterThread(RData rData,
ThreadGroup threadGroup) throws InterruptedException {
this.rData = rData;
RDataUpdaterThread = new Thread(threadGroup, this);
this.RDataUpdaterThread.start();
}
@Override
public void run() {
try{
RDataQueueSender queueSender = new RDataQueueSender();
session = DataAccessManager.getManager().openSession();
RDataQueueMsg message = new RDataQueueMsg();
RData updatedRData = updateSchedule(rData); /*postToQueue is updated here*/
/*
validations
Database query
Database insert
*/
if (postToQueue) {
postToQueue = false;
message = setMessage(updatedRData);
int retryCount = 0;
while(true){
try{
queueSender.postRequestToQueue(message);
break;
}catch(Exception e){
retryCount++;
if(retryCount>3){
break;
}
}
}
}
}catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
【问题讨论】:
-
好像没问题。您可能需要检查
rDataList是否有重复项。 -
检查是否相同。好像不是这样的。
-
那么错误可能在其他地方。您发布的代码似乎没问题。
-
即使 rDataList.size() 返回 1,run 块也会运行两次。
-
rDataUpdaterThread是如何定义的?我怀疑问题在于该类的实现。
标签: java multithreading executorservice