【问题标题】:Java: Change a variable in method 1, use changed variable in method 2 using multithreadingJava:更改方法1中的变量,使用方法2中使用多线程更改的变量
【发布时间】:2014-11-26 17:34:02
【问题描述】:

我有两种方法:第一种(多线程)等待输入,并根据您输入的内容打印 1、2、3,什么都没有或完全结束。第二个(Dumper)采用当前值 1、2 或 3 并每 300 毫秒打印一次(至少应该如此)。 两种方法都可以正常工作(1 打印我想要的值;每 300 毫秒打印 2 次),但我似乎无法让方法 2 获取方法 1 刚刚收到的值,即使它们同时运行。

我搜索了如何同时运行两者找到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();
    }
}

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

【问题讨论】:

  • 是的,正如@Mike'Pomax'Kamermans 所提到的,在这里你用不同的变量编写了两种不同的方法,比如status。这意味着变量状态不一样。他们没有分享您想要实现的目标。

标签: java multithreading variables


【解决方案1】:

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

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

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

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

在多线程类中,

Dumper device;

...

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多