为了账号安全,请及时绑定邮箱和手机立即绑定

Java ExecutorService 运行线程两次

Java ExecutorService 运行线程两次

白衣染霜花 2021-11-03 14:51:46
我有一个要遍历的列表,并且要为列表中的每个值调用一个方法。现在我已经将相关方法放在一个线程中,并使用执行程序服务来并行处理这些方法。但是,对于列表中的每个值,由于某种原因,该方法最终会被调用两次。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();    }@Overridepublic 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;                }            }        }               }    
查看完整描述

1 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

那是因为你开始了RDataUpdaterThread两次

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

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

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


查看完整回答
反对 回复 2021-11-03
  • 1 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信