我有一个要遍历的列表,并且要为列表中的每个值调用一个方法。现在我已经将相关方法放在一个线程中,并使用执行程序服务来并行处理这些方法。但是,对于列表中的每个值,由于某种原因,该方法最终会被调用两次。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(); }@Overridepublic 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; } } } }
1 回答
FFIVE
TA贡献1797条经验 获得超6个赞
那是因为你开始了RDataUpdaterThread
两次
首先在这里: service.execute(new RDataUpdaterThread(rData,this.rDataProcessorGroup));
第二次在这里: this.RDataUpdaterThread.start();
只需删除 this.RDataUpdaterThread.start();
添加回答
举报
0/150
提交
取消