[英]Java ExecutorService running threads twice
我有一個要遍歷的列表,並且對於列表中的每個值都將調用一個方法。 現在,我將相關方法放入線程中,並使用執行程序服務對方法進行並行處理。 但是,由於某種原因,對於列表中的每個值,該方法最終都會被調用兩次。
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.