java线程池和变量参数
这是我的密码:java线程池和变量参数,java,multithreading,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); } }); }
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);
}
});
}
final int g=0;
ExecutorService线程池=Executors.newFixedThreadPool(10);
对于(int i=0;i<10;i++){
threadPool.submit(新的Runnable(){
公开募捐{
g++;
myFunc(g);
}
});
}
显然,这不起作用,因为对变量g的并发访问
我尝试了很多方法,但都没有找到一个简单的方法来解决它。有什么解决办法吗
谢谢。在您的示例中,g是一个基本常数,因此您无法更改它。 另一方面,它必须是常量,才能从可运行的实现访问。 如果你想修改它,你必须使用一些线程安全类,比如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);
}
});
}
final AtomicInteger g=new AtomicInteger()
ExecutorService线程池=Executors.newFixedThreadPool(10);
对于(int i=0;i<10;i++){
threadPool.submit(新的Runnable(){
公开募捐{
int local=g.incrementAndGet();
myFunc(本地);
}
});
}
在您的示例中,您可以将g
的声明移动到for
循环中,将i
分配给最终g
,并在run()
中使用该声明
ExecutorService线程池=Executors.newFixedThreadPool(10);
对于(int i=0;i<10;i++){
最终整数g=i+1;
threadPool.submit(新的Runnable(){
公开募捐{
myFunc(g);
}
});
}
每当一个线程在与其他线程共享的资源上工作时,您必须同步。(或者使用一个更高级别的API在幕后进行,就像jdb的回答一样。)这是为了确保原子性,并使线程将其本地缓存同步在一起(否则,不能保证一个线程看到其他线程更新的值)。在没有synchronized
或volatile
的情况下,切勿执行多线程。有关更多信息,请参阅。+1。对于后代,请解释您的不同做法,以及为什么g++不是一个好主意。
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);
}
});
}