考虑一个带有JList或JTable的Swing应用程序,当选择更改时,会启动一个SwingWorker并从数据库加载相关数据并更新UI。这很好地工作,并且UI响应迅速。
但是,如果用户快速更改选定的行(按住上/下箭头键),我希望确保最后选择的行是最后加载的行,而且我不想无谓地查询数据库。因此,我想要一个具有LIFO队列大小为1的单线程Executor。因此,将任务提交给它会删除先前提交的任何任务,并使其最多执行1个任务,并且最多有1个任务等待执行。
在java.util.concurrent中,我找不到类似于此的内容,因此我编写了自己的Executor。我这样做是正确的吗?还是我错过了并发包中的某些内容?这种解决方案可接受,还是有更好的实现方式?
但是,如果用户快速更改选定的行(按住上/下箭头键),我希望确保最后选择的行是最后加载的行,而且我不想无谓地查询数据库。因此,我想要一个具有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());
}
}
});