我有一个Java Swing
显示图片列表的客户端应用程序。图片以 显示JLabel
。缩略图缓存在Firebird
数据库中并由 web-service 返回Soap/MTOM
。
Jlabel
我在 a 中创建所有的并在(如果尚未分配图标)SwingWorker
的绘制方法中检索缩略图。Jlabel
我正在使用 JavaExecutorService
调用返回每个缩略图的 Web 服务。
正如您在视频中看到的那样,当我向下滚动大量行时,我必须等待JLabel
滚动期间可见的所有缩略图都被获取。
ExecutorService
是这样实例化的:
ExecutorService executor = Executors.newFixedThreadPool(20);
paint
从方法何时调用的代码getIcon() == null
是:
executor.execute(new FutureTask<Void>(() -> {
var image = EdmWS.getInstance().getThumbnail(thumbnail.date, thumbnail.name, sizeThumbnail);
label.setIcon(new ImageIcon(image));
label.invalidate();
}, null));
有没有办法让执行器像 LIFO(后进先出)一样工作以JLabel
尽快显示缩略图?
感谢您的评论,带有 LIFO 订购的执行服务
executor = new ThreadPoolExecutor(20, 20, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<Runnable>() {
private static final long serialVersionUID = 1L;
@Override
public boolean offer(Runnable e) {
return super.offerFirst(e);
}
@Override
public boolean offer(Runnable e, long timeout, TimeUnit unit) throws InterruptedException {
return super.offerFirst(e, timeout, unit);
}
@Override
public boolean add(Runnable e) {
return super.offerFirst(e);
}
@Override
public void put(Runnable e) throws InterruptedException {
super.putFirst(e);
}
});
做这项工作。