我寫了一個類來檢查批處理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) 。
}
}
類似地,還有一個內部類
//Inner class。
private class GetBatchStatus {
private String batchId;
public GetBatchStatus(String batchID, ExecutorServcie exc){
this.batchId = batchID。
exc.execute(new CallBatchStatus(this.batchId) )。
}
和外部類中的私有方法
/Recursive Private method call of outer class。
private getBatchStatus(String batchId) {
String response = httpCall(batchId)。
if(!response.equals("COMPLETE"/span>)) {
resposne = getBatchStatus(batchId)。
}
return 回應。
}
我在執行器框架的幫助下,通過傳遞batchIds來執行這些執行緒,如下所示:
ExecutorService executorService = Executors. newFixedThreadPool(5)。
List<GetBatchStatus> listOfBatch = batchIds.stream().map(batchId -> new GetBatchStatus(batchId, executorService )).collector.toList()。
假設我傳遞了兩個批處理ID,并且它正在正常執行,但有時我得到正在處理的批處理的COMPLETE狀態和已經被執行的批處理的STARTED狀態。我不明白getBatchStatus中的回應變數是如何覆寫/交換的,因為這是一個本地變數,在不同的執行緒中運行。
uj5u.com熱心網友回復:
如果GetBatchStatus是外層類CallBatchStatus的內層類,當你實體化它時,你隱含地使用了CallBatchStatus的同一個實體,所以你在變數CallBatchStatus.batchId上有一個競賽條件。
你需要使用單獨的實體或復制值并使用一個靜態的內部類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/321086.html
標籤:
上一篇:為什么hibernate查詢要回傳一個Optionals的串列?
下一篇:緩沖影像在運行時是空的
