Java ExecutorService 运行 线程两次
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() 的 运行() 块内的代码针对列表中的每个值执行两次。 运行() 块没有任何循环。
任何人都可以告诉我在执行执行程序服务的过程中可能出现的问题吗?
编辑:
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();
我有一个要遍历的列表,要为列表中的每个值调用一个方法。现在我已经将相关方法放在一个线程中,并使用执行程序服务来并行处理这些方法。但是,对于列表中的每个值,由于某种原因该方法最终被调用两次。
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() 的 运行() 块内的代码针对列表中的每个值执行两次。 运行() 块没有任何循环。
任何人都可以告诉我在执行执行程序服务的过程中可能出现的问题吗?
编辑:
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();