【问题标题】:Sharing data between threads in Java在 Java 中的线程之间共享数据
【发布时间】:2018-11-01 16:54:33
【问题描述】:

我在从新线程访问主线程中的数据时遇到问题。只需使用主类 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 的哪个实例(只有一个实例,但它不知道)。有人可以帮助我了解我所缺少的吗?我已经看到在主类的函数中声明新类的示例,但为了代码组织的利益,我试图避免这种情况,因为我的工作线程会有点大。

【问题讨论】:

  • 驱动是如何定义的?
  • @jspcal 只是在第一段代码中定义为一个类。它没有在 workerThread 中定义。也许我需要以某种方式?
  • public String setMyVariable() 如果你想调用你调用的方式,这个方法应该是静态的。 stackoverflow.com/questions/21204589/…
  • 我猜你是在学走路之前尝试跑步。恕我直言,在尝试使用线程之前,您应该学习 Java 的基本概念。
  • 你为什么有new workerThread(this.getClass());?你可以只传递this,这是你类的一个实例。 getClass 获取基类。这扩展了Application,这是一个 javafx 应用程序吗?

标签: java multithreading


【解决方案1】:

您正在调用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();

【讨论】:

  • 这个也不编译。
  • 感谢您的回答。我无法在“Runnable myNewThread = new workerThread(this, this.getClass());”行编译时出现错误“workerThread (java.sql.Driver) 无法应用于驱动程序”似乎“this”与带有“Driver d”的workerThread所期望的类型不匹配
  • 你需要在你的类中修复import 语句以使用你的Driver 类而不是java.sql.Driver
  • 啊,我明白了!对于有类似问题的其他人,只需删除我的 workerThread 类顶部的 import java.sql.Driver 导入即可解决我的问题。
【解决方案2】:

当你直接从一个类中调用一个函数时,系统期望它是一个静态函数(就像你在这里做的那样:Driver.setMyVariable("test");)但是你的函数不是静态的,我认为它不应该是你的变量不是' t 也是静态的。如果你想使用单独的对象,你需要先用它的构造函数实例化它们

【讨论】:

  • 我明白为什么它需要像我所说的那样是静态的。因为我只有一个 Driver 类的实例,所以我认为将其设为静态应该没问题。但是,这样做并没有解决“无法解析符号”的问题。
【解决方案3】:

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

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

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

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

在做出此决定之前,请务必做好功课。

【讨论】:

  • 我明白为什么它需要像我所说的那样是静态的。因为我只有一个 Driver 类的实例,所以我相信将其设为静态应该没问题。但是,这样做并没有解决“无法解析符号”的问题。
【解决方案4】:

不要让它成为静态的。传递对象的实例。

//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");
    }
}

【讨论】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 2011-07-08
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多