启动线程时 JavaFX 冻结 - 我正在使用 Runlater 命令

JavaFX freezes when I start the thread - I'm using Runlater command

我有一个像这样的简单线程。

public class CameraThread 扩展线程 {

    private AtomicBoolean runCamera;

    public CameraThread(AtomicBoolean runCamera) {
        this.runCamera = runCamera;
    }

    @Override
    public void run() {
        while (Main.RUNTHREAD) {
            while (runCamera.get()) {
                Platform.runLater(() -> {
                    System.out.println("Hello");
                    threadSleep();
                });
            }
        }
    }

    private void threadSleep() {
        try {
            Thread.sleep(2000L);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

当我在线程外将 runCamera 设置为 runCamera.set(true) 时,整个 GUI 冻结,我什么也做不了。

这是一个最小的例子,我无法让它正常工作。 我以前用过RunLater命令,但是这次,我坐在2007年的Dell precision M6400机器上。难道这台机器不能处理Java的线程?

或者我该如何解决这个问题?

要重现此问题,只需键入以下内容:

wget https://github.com/DanielMartensson/Darknet-Data-Creator/archive/main.zip
unzip Darknet-Data-Creator-main.zip
cd Darknet-Data-Creator-main
mvn javafx:run

然后点击Scan按钮,select一个网络摄像头(USB,笔记本电脑摄像头)然后按Save to folder按钮。只是 select 一些任意文件夹。然后按Open camera按钮

问题是您在 Platform.runLater(...) 中使用 Thread.Sleep(),这意味着您正在休眠 GUI,而不是相机线程。

试试这个,注意 runLater 如何在 Platform.runLater 代码之外:

@Override
public void run() {
    while (Main.RUNTHREAD) {
        while (runCamera.get()) {
            Platform.runLater(() -> {
                System.out.println("Hello");
            });
            //Now thread sleep is outside of runLater:
            threadSleep();
        }
    }
}

唯一应该进入 runlater 的是直接改变 GUI 的东西。任何计算、睡眠、处理、文件读取等都应该分开。