如何在线程之间共享一个变量?
How to share a variable among the threads?
我有两个线程,名为 t1
和 t2
。它们只对 total
整数变量进行加法运算。但是变量 total
不在这些线程之间共享。我想在 t1
和 t2
线程中使用相同的 total
变量。我该怎么做?
我的 Adder
可运行 class:
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;
}
}
我的主class:
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)
}
}
两个打印语句都应给出 9 但它们分别给出 7 和 2(因为 total 变量不是 t1
和 t2
)。
最简单的方法是制作 total
static
,以便它在所有 Adder
个实例之间共享。
请注意,对于您在此处共享的 main
方法来说,这种简单的方法就足够了(实际上并没有 运行 任何并行的东西,因为每个线程都是 join
ed刚开始时)。对于线程安全的解决方案,您需要保护添加,例如,通过使用 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);
}
}
我有两个线程,名为 t1
和 t2
。它们只对 total
整数变量进行加法运算。但是变量 total
不在这些线程之间共享。我想在 t1
和 t2
线程中使用相同的 total
变量。我该怎么做?
我的 Adder
可运行 class:
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;
}
}
我的主class:
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)
}
}
两个打印语句都应给出 9 但它们分别给出 7 和 2(因为 total 变量不是 t1
和 t2
)。
最简单的方法是制作 total
static
,以便它在所有 Adder
个实例之间共享。
请注意,对于您在此处共享的 main
方法来说,这种简单的方法就足够了(实际上并没有 运行 任何并行的东西,因为每个线程都是 join
ed刚开始时)。对于线程安全的解决方案,您需要保护添加,例如,通过使用 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);
}
}