0

这是我的代码:

final int g = 0;

ExecutorService threadPool = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
    threadPool.submit(new Runnable() {
        public void run() {
            g++;
            myFunc(g);
        }
    });
}

显然,由于对变量 g 的并发访问,这不起作用。

我已经尝试了很多东西,但没有设法找到一个好的和简单的方法来修复它。有什么解决办法吗?

谢谢。

4

2 回答 2

7

在您的示例中, g 是一个原始常量,因此您无法更改它。另一方面,它必须是一个常量才能从 Runnable 实现中访问。如果你想修改它,你必须使用一些线程安全的类,比如 AtomicInteger。

尝试这个:

    final AtomicInteger g = new AtomicInteger()

    ExecutorService threadPool = Executors.newFixedThreadPool(10);
    for (int i = 0; i < 10; i++) {
        threadPool.submit(new Runnable() {
            public void run() {
                int local = g.incrementAndGet();
                myFunc(local);
            }
        });
    }
于 2013-01-25T20:28:29.357 回答
2

在您的示例中,您可以将声明移动gfor循环中,分配ifinal g,然后在 中使用它run()

ExecutorService threadPool = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
  final int g = i+1;
  threadPool.submit(new Runnable() {
    public void run() {
      myFunc(g);
    }
  });
}
于 2013-01-25T20:57:28.453 回答