考虑具有JList或JTable的Swing应用程序,当选择更改时,SwingWorker将启动并从数据库加载相关数据并更新UI。这工作正常,用户界面响应。“单个LIFO执行器”/ SwingWorker
但是,如果用户正在快速更改选定的行(保持键入/关闭)我想确保最后选择的行是最后一个加载的行,并且我也不想查询数据库徒然。所以我想要的是一个带有LIFO队列大小为1的单线程Executor。因此,向其提交任务会删除任何先前提交的任务,并一次执行至多1个任务,并且最多只有1个任务正在等待执行。
我在java.util.concurrent中找不到像这样的东西,所以我写了自己的Executor。我是对的吗?还是我错过了并发包中的一些东西?解决方案是可以接受的还是有更好的方法来实现我想要的?
public class SingleLIFOExecutor implements Executor
{
private final ThreadPoolExecutor executor;
private Runnable lastCommand;
public SingleLIFOExecutor()
{
executor = new ThreadPoolExecutor(0, 1, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
}
@Override
public void execute(Runnable command)
{
executor.remove(lastCommand);
lastCommand = command;
executor.execute(command);
}
}
而这里的展示它如何被使用的例子:
final Executor executor = new SingleLIFOExecutor();
JList jList = createMyList();
jList.addListSelectionListener(new ListSelectionListener()
{
@Override
public void valueChanged(ListSelectionEvent e)
{
if (!e.getValueIsAdjusting())
{
executor.execute(new MyWorker());
}
}
});