我无法从新线程访问主线程中的数据。只需使用主类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实例(只有一个实例,但它不知道)。有人能帮我理解我错过的东西吗?我已经看到在主类的函数中声明新类的示例,但我试图避免这种情况,因为我的工作线程会有点大。
答案 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();
}
}