在Java中的线程之间共享数据

时间:2018-05-22 20:19:25

标签: java multithreading

我无法从新线程访问主线程中的数据。只需使用主类getter / setter,我就可以做到这一点而不需要线程化。但是当我尝试启动一个新线程时,我再也不能这样做了。

主类:

public class Driver extends Application{

//create socket handlers
Runnable myNewThread = new workerThread();

//variables
private String lastMessage = "";

//getters and setters
public String setMyVariable() {
    this.MyVariable = MyVariable;
}

//main
public static void main(String[] args) {
    //launch threads
    new Thread(myNewThread).start();
}

NewThread类:

public class workerThread implements Runnable{

public void run() {
    Driver.setMyVariable("test");
}

我在workerThread课程中收到错误“无法解析符号'setMyVariable'”。据我所知,因为我的workerThread线程不知道要引用哪个Driver实例(只有一个实例,但它不知道)。有人能帮我理解我错过的东西吗?我已经看到在主类的函数中声明新类的示例,但我试图避免这种情况,因为我的工作线程会有点大。

5 个答案:

答案 0 :(得分:2)

您正在调用setMyVariable("test"),就像它是静态方法一样。您需要将Driver类的实例传递给workerThread的实例。

public class workerThread implements Runnable {
  private Driver driver;

  public workerThread(Driver d, Class c) {
    this.driver = d;
    //do whatever you are doing with existing Classs parameter
  }

  public void run() {
    driver.setMyVariable("test");
  }

并对Driver

进行更改
public class Driver extends Application{

  //create socket handlers
  Runnable myNewThread = new workerThread(this, this.getClass());

 //variables
 private String lastMessage = "";

 //getters and setters
 public String setMyVariable() {
   this.MyVariable = MyVariable;
 }

 //main
 public static void main(String[] args) {
   //launch threads
   new Thread(new Driver().myNewThread).start();
 }
}

更新:

因为myNewThread变量也是非静态的,你必须在Driver.main()中执行以下操作才能编译:

new Thread(new Driver().myNewThread).start();

答案 1 :(得分:0)

当你直接从一个类调用一个函数时,系统希望它是一个静态函数(就像你在这里:Driver.setMyVariable("test");)但是你的函数不是静态的,我认为它不应该像你一样变量也不是一成不变的。如果您希望使用单独的对象,则需要首先使用它的构造函数

对它们进行实例化

答案 2 :(得分:0)

您尝试调用静态方法而不将方法定义为静态方法。将您的方法更改为:

public static String setMyVariable() {
    this.MyVariable = MyVariable;
}

然后,您必须将MyVariable的定义更改为静态。

但是,我不确定你是否理解你所做的事情的后果。创建一个静态变量将允许您在线程之间共享数据,因为在您的类的所有实例中将有一个变量实例,但如果您不真正理解静态变量,这是一个潜在的危险事情。

在做出这个决定之前,请务必做好相关工作。

答案 3 :(得分:0)

不要让它静止。传递对象的实例。

//Runnable myNewThread = new workerThread(this.getClass());
Runnable myNewThread = new workerThread(this);

然后你的workerThread应该有一个构造函数。

public class workerThread implements Runnable{
    Driver driver;
    public workerThread(Driver driver){
        this.driver=driver;
    }
    public void run() {
        driver.setMyVariable("test");
    }
}

答案 4 :(得分:0)

public class Driver extends Application{

   public static Driver instance = new Driver();

   //create socket handlers
   public static Runnable myNewThread = new workerThread();

   //variables
   private String lastMessage = "";
   private static String MyVariable = "";

   //getters and setters
   public static String setMyVariable(String MyVariable) {
      instance.MyVariable = MyVariable;
      return MyVariable;
  }

  //main
  public static void main(String[] args) {
  //launch threads
      new Thread(myNewThread).start();
  }
}