寻找一种最正确/最优雅的方法来使对象的GET方法在对象内部刷新时阻止/等待。下面的示例代码可以模拟这种情况。
基本上,在构造对象时,它会转到数据源并填充其列表项。然后,多个客户端会使用该对象,这些客户端会定期调用各种GET方法来查询项目列表。
在内部,对象使用定期刷新项目列表的线程来保持自身的刷新和最新状态。
当对象刷新自身时,所有客户端GET调用都应等待/阻止,直到刷新完成。相反,如果在调用GET方法的过程中有客户端,则刷新不应开始。
我尝试了几种不同的方法来实现所需的功能(例如,通知/等待和倒计时锁存器)。但是,是否想知道人们认为实现这一目标的“最”正确/最好/最简单的方法是什么?
感谢Jab
public class MainResource {
private List<Item> items;
public MainResource() {
this.items = new ArrayList<Item>();
loadItems();
startRefreshTimer();
}
public Item getSpecificItem(int i) {
// This should wait if the items are being refreshed by the loadItems method
return this.items.get(i);
}
public List<Item> getAllItems() {
// This should wait if the items are being refreshed by the loadItems method
return this.items;
}
private void loadItems() {
// This should wait to execute if either the getSpecificItem() or getAllItems() methods are mid-execution
this.items.clear();
this.items.addAll(retrieveItems());
}
private List<Item> retrieveItems() {
List<Item> ret = new ArrayList<Item>();
// Do work to get all of the items.
// Typically takes a few seconds.
return ret;
}
private void startRefreshTimer() {
// Every few minutes, reload all of the items.
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
Runnable periodicTask = new Runnable() {
public void run() {
loadItems();
}
};
executor.scheduleAtFixedRate(periodicTask, 0, 120, TimeUnit.SECONDS);
}
}