gpt4 book ai didi

java - 如何在线程之间共享变量?

转载 作者:行者123 更新时间:2023-12-03 13:18:42 24 4
gpt4 key购买 nike

我有两个名为t1t2的线程。它们仅添加total整数变量。但是变量total不在这些线程之间共享。我想在totalt1线程中使用相同的t2变量。我怎样才能做到这一点?

我的Adder可运行类:

public class Adder implements Runnable{

int a;
int total;

public Adder(int a) {
this.a=a;
total = 0;
}

public int getTotal() {
return total;
}

@Override
public void run() {
total = total+a;

}

}

我的主类:
public class Main {

public static void main(String[] args) {

Adder adder1=new Adder(2);

Adder adder2= new Adder(7);

Thread t1= new Thread(adder1);
Thread t2= new Thread(adder2);

thread1.start();
try {
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

t2.start();
try {
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}


System.out.println(adder1.getTotal()); //prints 7 (But it should print 9)
System.out.println(adder2.getTotal()); //prints 2 (But it should print 9)


}

}

两个print语句都应给出9,但分别给出7和2(因为 t1t2并非总变量不是)。

最佳答案

最简单的方法是将total设为static,以便在所有Adder实例之间共享它。

请注意,对于您在此处共享的main方法而言,这种简单的方法就足够了(它实际上并不能并行运行任何东西,因为每个线程在启动后立即就被join编译)。对于线程安全的解决方案,您需要保护添加的内容,例如,使用 AtomicInteger :

public class Adder implements Runnable {

int a;
static AtomicInteger total = new AtomicInteger(0);

public Adder(int a) {
this.a = a;
}

public int getTotal() {
return total.get();
}

@Override
public void run() {
// return value is ignored
total.addAndGet(a);
}
}

关于java - 如何在线程之间共享变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59519239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com