Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java线程池和变量参数_Java_Multithreading - Fatal编程技术网

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);
    }
  });
}