【问题标题】:how to share variables between threads java [duplicate]如何在线程java之间共享变量[重复]
【发布时间】:2018-03-10 13:18:51
【问题描述】:

我想在线程之间共享变量,但它们给我带来了一些问题!我有一个整数,我希望主程序与它正在创建的线程共享并允许线程更改其值并被其他线程和主程序看到(我有两种不同类型的线程,我想创建一个以上)。我已经考虑了临界区。 这是我的程序的一部分:

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 和当他们想读/写线程时。

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

提前非常感谢你:)

【问题讨论】:

    标签: java multithreading java-threads


    【解决方案1】:

    整数是不可变的。因此,更改将永远不会反映在您的线程之间。
    作为替代方案,您可以将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();     
    }
    

    【讨论】:

      【解决方案2】:
      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();
                  }
      
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-05-01
        • 2021-01-27
        • 1970-01-01
        • 2019-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多