javafx多线程如何顺序执行?
我不知道是否还有其他好方法可以达到我想要的效果,谢谢 我有一个要求,根据URL,创建多个webview线程,并按顺序执行它们,比如线程执行,然后触发线程二执行,等等,我使用synchronized(lobject)方法,但在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
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();
}