【问题标题】:set<int, Future<Integer> is not applicable to arguments (int,int)set<int, Future<Integer> 不适用于参数 (int,int)
【发布时间】:2022-11-05 00:06:05
【问题描述】:

嗨,我正在使用由 10 个线程组成的 executorService 在 java 中执行并发编程任务。我有一个包含 100 个元素的数组,所有元素最初都设置为 1000。我想做的是数组中有 2 个索引,我需要将随机量从第一个索引转移到第二个索引,我的问题是我我不确定在这种情况下如何使用 set 函数,因为 set 的第二个参数应该是 Future。

        var ex = Executors.newFixedThreadPool(10);

        List<Future<Integer>> elements = new ArrayList<>();

        for (int i = 0; i < 100; i++) {
            elements.add(ex.submit(() -> {
                int val = 1000;
                return val;
            }));
        }

        ex.shutdown();

        int sum = 0;
        for (Future<Integer> el : elements) {
            sum += el.get();
        }
        System.out.println("Initial sum: " + sum);

for (int i = 0; i < 10_000; i++) {
            ex.submit(() -> {
                int firstIndex = ThreadLocalRandom.current().nextInt(100);
                int secondIndex = ThreadLocalRandom.current().nextInt(100);
                int randomAmount = ThreadLocalRandom.current().nextInt(1000);
                try {
                    if (elements.get(firstIndex).get() - randomAmount > 0) {
                        elements.set(firstIndex,elements.get(firstIndex).get() - randomAmount);
                    }
                } catch (InterruptedException | ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            });
        }

【问题讨论】:

    标签: java executorservice java.util.concurrent java-threads


    【解决方案1】:

    问题是元素数组包含期货。您正在尝试将整数放入包含 Future 对象的数组中,而不是整数。 Futures 也是不可变的,所以你也不能覆盖 Future 中的值。为什么要通过向 Executor 提交任务来创建元素数组?如果您只是创建一个整数数组,您将解决您的问题,但我并不完全清楚您正在编写的代码的重点是什么。此外,您在提交第一批后关闭了执行程序,因此将无法提交下一批。您还会遇到一些并发问题,因为您将有多个线程读取和写入同一个数组。

    var ex = Executors.newFixedThreadPool(10);
    
    List<Integer> elements = new ArrayList<>();
    
    for (int i = 0; i < 100; i++) {
      elements.add(1000);
    }
    
    //ex.shutdown();
    
    int sum = 0;
    for (int el : elements) {
      sum += el;
    }
    System.out.println("Initial sum: " + sum);
    
    for (int i = 0; i < 10_000; i++) {
      ex.submit(() -> {
          int firstIndex = ThreadLocalRandom.current().nextInt(100);
          int secondIndex = ThreadLocalRandom.current().nextInt(100);
          int randomAmount = ThreadLocalRandom.current().nextInt(1000);
          if (elements.get(firstIndex) - randomAmount > 0) {
              elements.set(firstIndex, elements.get(firstIndex) - randomAmount);
          }
      });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      • 2015-11-03
      • 2015-03-09
      • 2020-12-03
      相关资源
      最近更新 更多