我有一个要遍历的列表,并且对于列表中的每个值都将调用一个方法。现在,我将相关方法放入线程中,并使用执行程序服务对方法进行并行处理。但是,由于某种原因,对于列表中的每个值,该方法最终都会被调用两次。

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();

07-24 15:32