java 线程中的不一致

inconsistency in java thread

我写了一个class来检查批次API的状态。下面是实现。

//Inner class
private class CallBatchStatus implements Runnable {
    private String batchId;
      
    public CallBatchStatus(String batchId) {
          this.batchId = batchId;
    }

    @Override
    public void run() {
       getBatchStatus(this.batchId);
    }

 }

同理,还有一个内class

//Inner class
private class GetBatchStatus {
    private String batchId;
    public GetBatchStatus(String batchID, ExecutorServcie exc){
        this.batchId = batchID;
        exc.execute(new CallBatchStatus(this.batchId));
   }
}

和外部的私有方法class

//Recursive Private method call of outer class
private getBatchStatus(String batchId) {
    String response = httpCall(batchId);
    if(!response.equals("COMPLETE")) {
        resposne = getBatchStatus(batchId);
     }
     return response;
}

我在执行器框架的帮助下通过传递 batchIds 来执行这些线程,如下所示:

ExecutorService executorService = Executors.newFixedThreadPool(5);
List<GetBatchStatus> listOfBatch = batchIds.stream().map(batchId -> new GetBatchStatus(batchId, executorService )).collect(Collector.toList());

假设我正在传递两个批处理 ID 并且它正在正确执行,但有时我会得到正在处理的批处理的 COMPLETE 状态和已经执行的批处理的 STARTED 状态。我不明白 getBatchStatus 中的响应变量是如何覆盖/交换的,因为这是一个局部变量并且 运行 在不同的线程中。

如果 GetBatchStatus 是外部 class CallBatchStatus 的内部 class,当您实例化它时,您将隐式使用 CallBatchStatus 的相同实例,因此您在变量 CallBatchStatus.batchId.

您需要使用单独的实例或复制值并使用静态内部 class。