java线程池和变量参数

时间:2013-01-25 20:25:11

标签: java multithreading

这是我的代码:

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的并发访问,这不起作用。

我已经尝试了很多东西,但没有找到一个很好的方法来解决它。任何解决方案?

感谢。

2 个答案:

答案 0 :(得分: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);
            }
        });
    }

答案 1 :(得分:2)

在您的示例中,您可以将g的声明移至for循环,将i分配给final 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);
    }
  });
}