这是我的代码:
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的并发访问,这不起作用。
我已经尝试了很多东西,但没有找到一个很好的方法来解决它。任何解决方案?
感谢。
答案 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);
}
});
}