启动线程时 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 的东西。任何计算、睡眠、处理、文件读取等都应该分开。
我有一个像这样的简单线程。
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 的东西。任何计算、睡眠、处理、文件读取等都应该分开。