簡體   English   中英

Java 多線程:使用不同的線程創建新的 map

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM