java - Java ExecutorService 运行线程两次
问题描述
我有一个要遍历的列表,并且对于列表中的每个值都将调用一个方法。现在我已经将相关方法放在一个线程中,并使用执行器服务来并行处理这些方法。但是,对于列表中的每个值,由于某种原因,该方法最终会被调用两次。
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();
推荐阅读
- typescript - 如何从接口中省略一个属性,而不是 TypeScript 中的类型?
- php - 使用 wp_set_object_terms 以编程方式创建和插入 wordpress 产品标签
- r - 使用 dplyr:count [R] 时考虑数据权重
- ios - 关系的实体的数据是
- python - 偏移现有日期值,其中值存在于数据框中的另一列中
- java - 如何使触摸通过覆盖中的空白布局区域?
- java - java.lang.NoSuchMethodError com.fasterxml.jackson.core.JsonParseException 使用 dropbox v2 核心 api java
- python - 将嵌套列表转换为深度为 1 的列表列表
- tensorflow - Colab ImportError:无法导入名称“squeeze_or_expand_dimensions”
- python - 将授权标头返回给 QGIS?