如何在线程之间共享变量 java
how to share variables between threads java
我有一些变量想在线程之间共享,但它们给我带来了一些问题!我有一个整数,我希望主程序与它正在创建的线程共享并允许线程更改它的值并被其他线程和主程序看到(我有两种不同类型的线程,我想创建每个都不止一个)。我已经考虑了关键部分。
这是我程序的一部分:
public static void main(String[] args) throws InterruptedException{
Integer t = 0; //What do I change here?
(new Te(t)).start();
(new In(t)).start();
}
我还没有写完我的所有程序,但在这种情况下,感兴趣的变量是 t,它将被线程更改,并且它的新值必须被主程序看到,以防它创建一个新的线程和当线程想要 read/write .
如果仅凭这些还不清楚,如果需要,我可以 post 更多代码!
非常感谢您:)
public class EvenOdd {
static int a = 0;
public static void main(String[] args) {
EvenOdd eo = new EvenOdd();
A aobj = eo.new A();
B bobj = eo.new B();
aobj.a = Lock.lock1;
aobj.b = Lock.lock2;
bobj.a = Lock.lock2;
bobj.b = Lock.lock1;
Thread t1 = new Thread(aobj);
Thread t2 = new Thread(bobj);
t1.start();
t2.start();
}
static class Lock {
final static Object lock1 = new Object();
final static Object lock2 = new Object();
}
class A implements Runnable {
Object a;
Object b;
public void run() {
while (EvenOdd.a < 10) {
try {
System.out.println(++EvenOdd.a + " A ");
synchronized (a) {
a.notify();
}
synchronized (b) {
b.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class B implements Runnable {
Object a;
Object b;
public void run() {
while (EvenOdd.a < 10) {
try {
synchronized (b) {
b.wait();
System.out.println(++EvenOdd.a + " B ");
}
synchronized (a) {
a.notify();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
整数是不可变的。因此更改永远不会反映在您的线程之间。
作为替代方案,您可以将 Integer
包装在共享对象中,并为 access/change 包装的 Integer
值提供线程安全方法。
客户端可能看起来像:
public static void main(String[] args) throws InterruptedException{
ThreadSafeInteger o = new ThreadSafeInteger();
new Te(o).start();
new In(o).start();
}
或者更简单地使用 AtomicInteger
来解决需求,因为它包装了 int
,此外它还确保 int
值的原子更新。
客户端可能看起来像:
public static void main(String[] args) throws InterruptedException{
AtomicInteger o = new AtomicInteger();
new Te(o).start();
new In(o).start();
}
我有一些变量想在线程之间共享,但它们给我带来了一些问题!我有一个整数,我希望主程序与它正在创建的线程共享并允许线程更改它的值并被其他线程和主程序看到(我有两种不同类型的线程,我想创建每个都不止一个)。我已经考虑了关键部分。 这是我程序的一部分:
public static void main(String[] args) throws InterruptedException{
Integer t = 0; //What do I change here?
(new Te(t)).start();
(new In(t)).start();
}
我还没有写完我的所有程序,但在这种情况下,感兴趣的变量是 t,它将被线程更改,并且它的新值必须被主程序看到,以防它创建一个新的线程和当线程想要 read/write .
如果仅凭这些还不清楚,如果需要,我可以 post 更多代码!
非常感谢您:)
public class EvenOdd {
static int a = 0;
public static void main(String[] args) {
EvenOdd eo = new EvenOdd();
A aobj = eo.new A();
B bobj = eo.new B();
aobj.a = Lock.lock1;
aobj.b = Lock.lock2;
bobj.a = Lock.lock2;
bobj.b = Lock.lock1;
Thread t1 = new Thread(aobj);
Thread t2 = new Thread(bobj);
t1.start();
t2.start();
}
static class Lock {
final static Object lock1 = new Object();
final static Object lock2 = new Object();
}
class A implements Runnable {
Object a;
Object b;
public void run() {
while (EvenOdd.a < 10) {
try {
System.out.println(++EvenOdd.a + " A ");
synchronized (a) {
a.notify();
}
synchronized (b) {
b.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class B implements Runnable {
Object a;
Object b;
public void run() {
while (EvenOdd.a < 10) {
try {
synchronized (b) {
b.wait();
System.out.println(++EvenOdd.a + " B ");
}
synchronized (a) {
a.notify();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
整数是不可变的。因此更改永远不会反映在您的线程之间。
作为替代方案,您可以将 Integer
包装在共享对象中,并为 access/change 包装的 Integer
值提供线程安全方法。
客户端可能看起来像:
public static void main(String[] args) throws InterruptedException{
ThreadSafeInteger o = new ThreadSafeInteger();
new Te(o).start();
new In(o).start();
}
或者更简单地使用 AtomicInteger
来解决需求,因为它包装了 int
,此外它还确保 int
值的原子更新。
客户端可能看起来像:
public static void main(String[] args) throws InterruptedException{
AtomicInteger o = new AtomicInteger();
new Te(o).start();
new In(o).start();
}