1

我有一个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);
    }
});

做这项工作。

4

0 回答 0