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;

                }

            }

        }           

    }

    

白衣染霜花
浏览 113回答 1
1回答

FFIVE

那是因为你开始了RDataUpdaterThread两次首先在这里: service.execute(new RDataUpdaterThread(rData,this.rDataProcessorGroup));第二次在这里: this.RDataUpdaterThread.start();只需删除 this.RDataUpdaterThread.start();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java