【问题标题】:Java ExecutorService running threads twiceJava ExecutorService 运行线程两次
【发布时间】:2018-10-07 10:17:26
【问题描述】:

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

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

【问题讨论】:

  • 好像没问题。您可能需要检查rDataList 是否有重复项。
  • 检查是否相同。好像不是这样的。
  • 那么错误可能在其他地方。您发布的代码似乎没问题。
  • 即使 rDataList.size() 返回 1,run 块也会运行两次。
  • rDataUpdaterThread 是如何定义的?我怀疑问题在于该类的实现。

标签: java multithreading executorservice


【解决方案1】:

这是因为你启动了两次RDataUpdaterThread

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

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

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

【讨论】:

    猜你喜欢
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多