JavaFX线程与Java线程的同步
有没有办法同步JavaFX平台线程和标准Java线程?当前,当被触发时,JavaFX线程在标准Java线程完成将所有图像添加到可观察列表之前触发,因此imageList将使用空白集合进行更新JavaFX线程与Java线程的同步,java,multithreading,javafx-2,java.util.concurrent,Java,Multithreading,Javafx 2,Java.util.concurrent,有没有办法同步JavaFX平台线程和标准Java线程?当前,当被触发时,JavaFX线程在标准Java线程完成将所有图像添加到可观察列表之前触发,因此imageList将使用空白集合进行更新 private final TilePane imageList; final File[] files = new File(dir).listFiles(); final List<ImageView> views = FXCollections.observableArrayList();
private final TilePane imageList;
final File[] files = new File(dir).listFiles();
final List<ImageView> views = FXCollections.observableArrayList();
new Thread() {
@Override
public void run() {
for (final File file : files) {
if (Utils.fileIsImage(file) && !file.isDirectory()) {
ImageView view = new ImageView(new Image("file:" + file, 72, 72, false, true));
views.add(view);
}
}
}
}.start();
Platform.runLater(new Runnable() {
@Override
public void run() {
imageList.getChildren().addAll(views);
}
});
我对JavaFX和并发性比较陌生,并且没有任何线程锁的经验,所以任何帮助都会很好。谢谢
new Thread() {
@Override
public void run() {
for (final File file : files) {
if (Utils.fileIsImage(file) && !file.isDirectory()) {
ImageView view = new ImageView(new Image("file:" + file, 72, 72, false, true));
views.add(view);
}
}
Platform.runLater(new Runnable() {
@Override
public void run() {
imageList.getChildren().addAll(views);
}
});
}
}.start();
只要已加载视图,请考虑逐个添加视图:
if (Utils.fileIsImage(file) && !file.isDirectory()) {
ImageView view = new ImageView(new Image("file:" + file, 72, 72, false, true));
views.add(view);
Platform.runLater(new Runnable() {
@Override
public void run() {
imageList.getChildren().add(view);
}
});
}
只要已加载视图,请考虑逐个添加视图:
if (Utils.fileIsImage(file) && !file.isDirectory()) {
ImageView view = new ImageView(new Image("file:" + file, 72, 72, false, true));
views.add(view);
Platform.runLater(new Runnable() {
@Override
public void run() {
imageList.getChildren().add(view);
}
});
}
这已经奏效了,非常感谢!然而,这并不是针对大量图像的最有效解决方案,但就目前而言,这是一个比我预期的简单得多的解决方案。对于大量图像,请从2-4开始执行多个线程。首先将所有文件的名称放在一个队列中,让每个线程轮询该队列,并在队列为空时退出。这已经奏效了,非常感谢!然而,这并不是针对大量图像的最有效解决方案,但就目前而言,这是一个比我预期的简单得多的解决方案。对于大量图像,请从2-4开始执行多个线程。首先将所有文件的名称放入队列,让每个线程轮询该队列,并在队列为空时退出。