Java ExecutorService запускает потоки дважды - PullRequest
0 голосов
/ 07 октября 2018

У меня есть список, который нужно просмотреть, и для каждого значения в списке должен быть вызван метод.Теперь я поместил соответствующий метод в поток и использовал службу executor для параллельной обработки методов.Однако для каждого значения в списке метод по какой-то причине вызывается дважды.

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

Код внутри блока run () RDataUpdaterThread () выполняется дважды для каждого значения всписок.Блок 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 голосов
/ 07 октября 2018

Это потому, что вы начинаете RDataUpdaterThread дважды

Первый здесь: service.execute(new RDataUpdaterThread(rData,this.rDataProcessorGroup));

Второй раз здесь: this.RDataUpdaterThread.start();

Просто удалите this.RDataUpdaterThread.start();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...