考慮具有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());
}
}
});