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。
我写了一个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。