【问题标题】:concurrency using ExecutorService使用 ExecutorService 并发
【发布时间】:2017-12-30 14:51:59
【问题描述】:

我有一个简单的程序来使用 ThreadPool 和 ExecutorService 计算从 1 到 9 的数字。 每个线程等待 1 秒执行。但是,下面的程序给了我每次执行的随机输出。

如何解决这个问题,使其始终产生 45?

public static void main(String[] args) throws InterruptedException {
    AtomicLong count = new AtomicLong(0);
    ExecutorService executor = Executors.newFixedThreadPool(10);
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    for(Integer i : list) {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                count.set(count.get() + i);
            }
        });
    }

    System.out.println("Waiting...");

    executor.shutdown();
    executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);
    System.out.println("Total::"+count.get());

    System.out.println("Done");
}

【问题讨论】:

标签: java multithreading concurrency threadpoolexecutor


【解决方案1】:

代替

count.set(count.get() + i);

使用

count.addAndGet(i);

addAndGet 方法以原子方式添加值,但顺序 getset 不是原子操作。

【讨论】:

    【解决方案2】:

    AtomicLong 具有特殊的原子方法。在使用它们时,您只能获得原子保证(对 add()get() 的单独调用将不是是原子的)。 AtomicLong 上有一些方法可以以原子方式“添加”到当前值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多