Java对象的Get方法等待对象定期刷新自身

时间:2018-12-29 13:18:49

标签: java concurrency

寻找一种最正确/最优雅的方法来使对象的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);
    }
}

0 个答案:

没有答案