我想在线程之间共享变量,但是它们给了我一些问题!我有一个Integer,我希望主程序与它正在创建的线程共享,并允许线程更改其值并被其他线程和主程序看到(我有两种不同类型的线程,我想创建不止一个)。我已经考虑了关键部分。 这是我的计划的一部分:
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,它将由Threads改变,并且如果它创建一个新的Thread并且由他们想要读/写的线程。
如果不清楚这些,我可以发布更多代码,如果需要的话!
非常感谢您提前:))
答案 0 :(得分:5)
整数是不可变的。所以你的主题之间永远不会反映出变化
或者,您可以将Integer
包装在共享对象中,并提供线程安全方法来访问/更改包装的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();
}
答案 1 :(得分:0)
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();
}
}
}
}