Java ExecutorService运行线程两次

时间:2018-10-07 10:17:27

标签: java multithreading 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();
    }
}

1 个答案:

答案 0 :(得分:1)

这是因为您两次启动RDataUpdaterThread

首先在这里: service.execute(new RDataUpdaterThread(rData,this.rDataProcessorGroup));

第二次在这里: this.RDataUpdaterThread.start();

只需删除this.RDataUpdaterThread.start();