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

时间:2018-03-10 13:18:51

标签: java multithreading java-threads

我想在线程之间共享变量,但是它们给了我一些问题!我有一个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并且由他们想要读/写的线程。

如果不清楚这些,我可以发布更多代码,如果需要的话!

非常感谢您提前:))

2 个答案:

答案 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();
            }

        }
    }
}