javafx多线程如何顺序执行?

javafx多线程如何顺序执行?,java,multithreading,javafx,Java,Multithreading,Javafx,我不知道是否还有其他好方法可以达到我想要的效果,谢谢 我有一个要求,根据URL,创建多个webview线程,并按顺序执行它们,比如线程执行,然后触发线程二执行,等等,我使用synchronized(lobject)方法,但在JAVAfx中遇到一个问题,代码如下: public class LockObject { public int orderNum = 1; public final static int MaxValue=9; public LockObject

我不知道是否还有其他好方法可以达到我想要的效果,谢谢

我有一个要求,根据URL,创建多个webview线程,并按顺序执行它们,比如线程执行,然后触发线程二执行,等等,我使用synchronized(lobject)方法,但在JAVAfx中遇到一个问题,代码如下:

public class LockObject {

    public int orderNum = 1;
    public final static int MaxValue=9;

    public LockObject(int orderNum){
        this.orderNum = orderNum;
    }
}

公共类下载线程扩展线程{
私有锁对象对象对象;
私有int printNum=0;
私有字符串url;
公共下载线程(LockObject lobject、int printNum、字符串url){
this.lobject=lobject;
this.printNum=printNum;
this.url=url;
}
@凌驾
公开募捐{
已同步(lobject){

如果您需要执行多个任务,则不需要创建多个线程。只使用一个线程将保证下一个任务只在上一个任务完成后执行。您还应该考虑使用A而不是在对象上同步。

ExecutorService executor = Executors.newSingleThreadExecutor();
try {
    for (UrlModel model : tableView.getItems()) {
        executor.submit(() -> {
            CountDownLatch latch = new CountDownLatch(1);
            Platform.runLater(() -> {
                engine.load(model.getLink())
                engine.getLoadWorker().runningProperty().addListener((obs, ov, nv) -> {
                    if (!nv) {
                        latch.countDown();
                    }
                });
            });
            latch.await();
            // do whatever needs to happen after the WebEngine finishes loading
            return null; // using #submit(Callable) and Callable needs to return something
        });
    }
} finally {
    executor.shutdown();
}
一些注意事项:

  • 如果表中没有要处理的项,您可能希望避免创建
    ExecutorService
    。也就是说,假设您每次都不重用相同的
    ExecutorService
  • 如果重新使用
    ExecutorService
    ,请不要调用
    shutdown()
  • ExecutorService
    使用非守护进程线程。您可以通过提供创建守护进程线程的
    ThreadFactory
    对其进行自定义
  • 我在
    Worker#running
    属性中添加了一个监听器,而不是
    status
    属性,以便更容易地确保无论加载的终端状态如何(即是
    成功
    取消
    还是
    失败
    ),都能调用
    倒计时()
  • 完成后,您可能希望删除添加到
    工作者
    属性的侦听器。可以使用匿名类(而不是我使用的lambda表达式)并调用
    obs.removeListener(此)
    changed
    方法中,其中
    obs
    observeValue
    参数

如果需要按顺序执行多个任务,则不需要创建多个线程。只使用一个线程将保证下一个任务只在上一个任务完成后执行。您还应该考虑使用A而不是在对象上同步。

ExecutorService executor = Executors.newSingleThreadExecutor();
try {
    for (UrlModel model : tableView.getItems()) {
        executor.submit(() -> {
            CountDownLatch latch = new CountDownLatch(1);
            Platform.runLater(() -> {
                engine.load(model.getLink())
                engine.getLoadWorker().runningProperty().addListener((obs, ov, nv) -> {
                    if (!nv) {
                        latch.countDown();
                    }
                });
            });
            latch.await();
            // do whatever needs to happen after the WebEngine finishes loading
            return null; // using #submit(Callable) and Callable needs to return something
        });
    }
} finally {
    executor.shutdown();
}
一些注意事项:

  • 如果表中没有要处理的项,您可能希望避免创建
    ExecutorService
    。也就是说,假设您每次都不重用相同的
    ExecutorService
  • 如果重新使用
    ExecutorService
    ,请不要调用
    shutdown()
  • ExecutorService
    使用非守护进程线程。您可以通过提供创建守护进程线程的
    ThreadFactory
    对其进行自定义
  • 我在
    Worker#running
    属性中添加了一个监听器,而不是
    status
    属性,以便更容易地确保无论加载的终端状态如何(即是
    成功
    取消
    还是
    失败
    ),都能调用
    倒计时()
  • 完成后,您可能希望删除添加到
    工作者
    属性的侦听器。可以使用匿名类(而不是我使用的lambda表达式)并调用
    obs.removeListener(此)
    changed
    方法中,其中
    obs
    observeValue
    参数

当所有工作都应该一个接一个顺序地完成时,创建多个线程有什么意义?为什么不使用一个线程来代替?当所有工作都应该一个接一个顺序地完成时,创建多个线程有什么意义?为什么不使用一个线程来代替?我认为一个单线程执行器会使很高兴你花时间写下来:-)我认为单线程执行器会是一个很好的答案。很高兴你花时间写下来:-)
ExecutorService executor = Executors.newSingleThreadExecutor();
try {
    for (UrlModel model : tableView.getItems()) {
        executor.submit(() -> {
            CountDownLatch latch = new CountDownLatch(1);
            Platform.runLater(() -> {
                engine.load(model.getLink())
                engine.getLoadWorker().runningProperty().addListener((obs, ov, nv) -> {
                    if (!nv) {
                        latch.countDown();
                    }
                });
            });
            latch.await();
            // do whatever needs to happen after the WebEngine finishes loading
            return null; // using #submit(Callable) and Callable needs to return something
        });
    }
} finally {
    executor.shutdown();
}