当我启动线程时javafx冻结-我正在使用runlater命令

btxsgosb  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(358)

我有一根这样的线。
公共类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();
        }
    }
}

当我开始 runCamerarunCamera.set(true) 在线程的外面,整个gui都冻结了,我什么都做不了。
这是一个最小的例子,我不能让它正常工作。我用过 RunLater 但这次,我坐在 Dell precision M6400 从2007年开始。有没有可能这台机器不能用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 按钮,选择网络摄像头(usb、笔记本电脑摄像头),然后按 Save to folder 按钮。只需选择一些任意文件夹。然后按 Open camera 按钮

t8e9dugd

t8e9dugd1#

问题是你正在使用 Thread.Sleep() 内部 Platform.runLater(...) ,这意味着您正在休眠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的事情。任何计算、睡眠、处理、文件读取等都应分开保存。

相关问题