Java:更改方法1中的变量,使用多线程在方法2中使用更改的变量

时间:2014-11-26 17:34:02

标签: java multithreading variables

我有两种方法:第一种(MultiThreaded)等待输入,根据你键入的内容,它会打印1,2,3,无或完全结束。第二个(Dumper)取当前值1,2或3并每300ms打印一次(至少它应该)。 两种方法单独工作正常(1打印我想要的值;每300ms打印2次),但我似乎无法获得方法2来获取方法1刚收到的值,即使它们同时运行。< / p>

我搜索了如何同时运行这两个this,所以我知道我必须使用线程。那么如何使用另一种方法中的变量(或者同时使用两种方法)查找this - 但是我猜我使用volatile的方式不正确?

这是我的代码:

MultiThreaded.java

public class MultiThreaded extends Thread{
volatile int status ;


public static void main(String[] args) {
    new MultiThreaded().execute_input();
}

public MultiThreaded() {

}
        public void run() {
            System.out.println("BEGIN");
            while(true) new MultiThreaded().execute_input();
        }   

        public void execute_input() {
        int input;
        while (true) {
            try {
                input = System.in.read();
            } catch (Exception e) {input = 0;}
            switch(input) {
            case '1' :  
            case '2' :  
            case '3' :  
                status = input-'0';
                System.out.print(status);   
                break;
            case 'q':   //End
                return;
            default:
            }
        }
    }
}

Dumper.java

class Dumper extends Thread{
volatile int status;

      public static void main (String[] args) {
            new Dumper().run();
        }

      public void run() {
          while(true) printName();
          }

      private void printName() {
        System.out.print("[");
        System.out.print(status);
        System.out.println("]");
        try { Thread.sleep(300); }
        catch (Exception e) {}
      }
}

Main.java

public class Main {
    public static void main(String[] args) {
        new MultiThreaded().start();
        new Dumper().start();
    }
}

我很感激任何建议,因为我现在很迷茫。提前谢谢了! :)

1 个答案:

答案 0 :(得分:0)

我没有看到您的代码的任何部分确保两个线程共享相同的status:只是因为它们具有相同的名称并不意味着它们是相同的变量

到目前为止,你所做的是在代码中,&#34;两个类都有自己的变量状态,并且可以从线程&#34;中修改,但是现在你仍然需要编写确保操作实际发生的代码。例如,您可以在MultiTreaded实例可以调用的Dumper上使用setStatus(int s)方法,或者甚至可以直接操作dumper.status变量。

无论你使用什么,至少有一个线程需要知道另一个存在。例如:

public static void main(String[] args) {
  Dumper device = new Dumper();
  MultiThreaded master = new MultiThreaded(device);
  master.start();
  device.start();
}

并在MultiThreaded类中,

Dumper device;

...

public MultiThreaded(Dumper device) {
  this.device = device;
}

public void execute_input() {
  ...
  device.status = status;
}