[英]Java MultiThreading : Create new map with different thread
我正在使用多線程一段時間。 在以下情況下,我需要一些幫助。 我有一個項目清單。 我想為列表中的每個項目執行一個方法,並將列表中每個項目的不同結果存儲在 map 中,其中鍵是項目,值是結果。
public class RecordData {
public static void main(String[] args) throws InterruptedException {
List<String> names = new ArrayList<>();
names.add("Krish");
names.add("harry");
names.add("Rin");
DataGenerator generator = new DataGenerator(
Executors.newFixedThreadPool(3));
names.forEach(t -> generator.start(t));
Thread.sleep(Duration.ofSeconds(2).toMillis());
generator.stop();
ConcurrentHashMap<String, DataGenerator.Result> resultMap = generator.getResultMap();
System.out.println("resultMap");
}
}
public class DataGenerator {
private final ExecutorService executor;
private final Random random;
private List<String> request;
private ConcurrentHashMap<UsageConsumed, Double> usageMap ;
private ConcurrentHashMap<String, Result> resultMap= new ConcurrentHashMap<>();
// Used to signal a graceful shutdown
private volatile boolean stop = false;
public DataGenerator(ExecutorService executor) {
this.executor = executor;
this.random = new Random();
}
public void start(String name) {
Runnable generator = () -> {
successfulRequest = new ArrayList<>();
usageMap= new ConcurrentHashMap<>();
usageMap.put(UsageConsumed.Write, 0.0);
usageMap.put(UsageConsumed.Read, 0.0);
try {
while (!stop) {
// my logic
//getData(status, productname, read, write);
}
Map<String, Long> successfulRequestLatencyMap;
synchronized(successfulRequest) {
successfulRequestLatencyMap = successfulRequest.stream().collect(Collectors.
groupingBy(e -> e, Collectors.counting()));
}
Result result = new Result(usageMap,
successfulRequestLatencyMap);
resultMap.put(name, result);
} catch (Exception e) {
throw e;
}
};
executor.execute(generator);
}
public void stop() {
// Signal our thread to stop
stop = true;
// The shutdown the executor (after waiting a bit to be nice)
try {
executor.awaitTermination(1000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
// Purposely ignore any InterruptedException
Thread.currentThread().interrupt();
}
executor.shutdownNow();
}
private void getData(int status, String productname, Double read,
Double write) {
if (status == 200) {
request.add(productname);
}
usageMap.put(UsageConsumed.Read, usageMap.get(UsageConsumed.Read)+ read);
usageMap.put(UsageConsumed.Write, usageMap.get(UsageConsumed.Write)+ write);
}
public ConcurrentHashMap<String, Result> getResultMap() {
return resultMap;
}
public enum UsageConsumed {
Read,
Write
}
public class Result {
private ConcurrentHashMap<UsageConsumed, Double> usageMap;
private Map<String, Long> successfulRequestMap;
public Result(ConcurrentHashMap<UsageConsumed, Double> usageMap,
Map<String, Long> RequestMap) {
this.usageMap = usageMap;
this.successfulRequestMap = RequestMap;
}
}
}
我遇到了一個問題:盡管值應該不同,但對於列表中的每個項目,我得到了相同的 usageMap 和successfulRequestMap 結果。 我用上面的代碼得到的結果是所有三個項目組合在一起的結果。 需要幫助我怎樣才能得到正確的結果。
您必須在start()
usageMap
本地,並將其作為參數傳遞給getData()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.