我有一个要遍历的列表,并且对于列表中的每个值都将调用一个方法。现在,我将相关方法放入线程中,并使用执行程序服务对方法进行并行处理。但是,由于某种原因,对于列表中的每个值,该方法最终都会被调用两次。
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();
}
}
最佳答案
这是因为您两次启动RDataUpdaterThread
首先在这里:service.execute(new RDataUpdaterThread(rData,this.rDataProcessorGroup));
第二次在这里:this.RDataUpdaterThread.start();
只需删除this.RDataUpdaterThread.start();