gpt4 book ai didi

java - boolean 值不会从 Object.getBoolean() 更新;

转载 作者:行者123 更新时间:2023-11-29 06:29:42 26 4
gpt4 key购买 nike

差不多,我正在尝试编写一个让用户选择文件的简单程序。不幸的是,通过 Swing 的 JFileChooser 有点过时了,所以我正在尝试为此使用 JavaFX FileChooser。目标是将 FileGetter 作为线程运行,将文件数据传输到主类,然后从那里继续。

主类:

package application;
import java.io.File;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;


public class Main {

public static void main(String[] args) {
Thread t1 = new Thread(new FileGetter());
FileGetter fg = new FileGetter();
t1.start();
boolean isReady = false;
while(isReady == false){
isReady = FileGetter.getIsReady();
}
File file = FileGetter.getFile();

System.out.println(file.getAbsolutePath());
...

}
}

FileGetter 类:

package application;

import java.io.File;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;


public class FileGetter extends Application implements Runnable {

static File file;
static boolean isReady = false;


@Override
public void start(Stage primaryStage) {
try {

FileChooser fc = new FileChooser();
while(file == null){
file = fc.showOpenDialog(primaryStage);
}
isReady = true;
Platform.exit();
} catch(Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
launch();
}

public static boolean getIsReady(){
return isReady;
}

public static File getFile(){
return file;
}

}

问题是,当用户选择一个文件时,while 循环中 isReady 的值不会更新为 true(我拥有它的原因是为了防止 Main 中的代码继续将 File 设置为 null)。

非常感谢任何帮助、替代建议或解释为什么会发生这种情况!

最佳答案

java 内存模型不要求变量值在不同线程中必须相同,除非在特定条件下。

这里发生的事情是 FileGetter 线程正在更新自己的内存中的值,该内存只能从该线程访问,但是您的主线程看不到更新后的值,因为它只看到存储在它自己的内存中的变量版本与 FileGetter 线程的版本不同。每个线程在内存中都有自己的字段副本,根据 Java 规范,这完全没问题。

要解决此问题,您只需将 volatile 修饰符添加到 isReady 即可:

static volatile boolean isReady = false;

这确保更新后的值在您的主线程中可见。

此外,我建议减少您创建的 FileGetter 实例的数量。在您的代码中创建了 3 个实例,但只使用了 1 个。

Thread t1 = new Thread(() -> Application.launch(FileGetter.class));
t1.start();
...

关于java - boolean 值不会从 Object.getBoolean() 更新;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39009287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com