何时存在,如何从地图中获取数据?

秋冬

以下是我的启动后台线程的工厂代码TempScheduler-

public class TempClientFactory {

    public static IClient getInstance() {
    new TempScheduler().startScheduler();
    return ClientHolder.INSTANCE;
    }

    private static class ClientHolder {
        private static final TempClient INSTANCE = new TempClient();
    }
} 

现在,客户将使用上述工厂通过上述工厂调用我们的代码。他们只会获得一次我们的Client实例,然后继续使用该实例来调用read我的实现中方法-

IClient client = TempClientFactory.getInstance();
String response = client.read(userId);

下面是我的后台线程代码,它将从URL获取数据,进行解析并将其存储在类变量中-

public class TempScheduler {

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

        public void startScheduler() {
            final ScheduledFuture<?> taskHandle = scheduler.scheduleAtFixedRate(new Runnable() {
                public void run() {
                try {
                    callServers();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                }
            }, 0, 10, TimeUnit.MINUTES);
        }
    }

    // call the servers and get the data and then parse 
    // the response.
    private void callServers() {
        String url = "url";
        RestTemplate restTemplate = new RestTemplate();
        String response = restTemplate.getForObject(url, String.class);
        parseResponse(response);

    }

    // parse the response and store it in a variable
    private void parseResponse(String response) {
        //...       
        ConcurrentHashMap<String, Map<Integer, String>> primaryTables = null;

        //...

        // store the data in ClientData class variables which can be
        // used by other threads
        ClientData.setPrimaryMapping(primaryTables);
    }
}

解析来自URL的数据后,我上面的后台线程将ClientData通过使用其setter将结果存储在我的类的变量中。下面是我的ClientData class

public class ClientData {

    private static final AtomicReference<Map<String, Map<Integer, String>>> primaryMapping = new AtomicReference<>();

    public static Map<String, Map<Integer, String>> getPrimaryMapping() {
        return primaryMapping.get();
    }

    public static void setPrimaryMapping(Map<String, Map<Integer, String>> map) {
        primaryMapping.set(map);
    }
}

问题陈述:-

现在有趣的部分到了,正如您所看到的,客户将使用上述工厂调用我们的代码,并在他们对getInstance()方法进行调用后立即启动我的后台线程,该后台线程将从URL中获取数据,然后解析并将其存储在类变量中。但是getInstance()执行方法后,他们将read method立即在我的客户代码中调用

然后,我应该在实现代码中使用由后台线程设置的变量。我的实现代码具有read方法的用途CallableTaksfuture.get因此它将自动出现在call下面的方法中。在下面的类中,我应该使用由我的后台线程设置的变量值。我需要使用getPrimaryMappingmethod来获取下面的代码中的值。

public class ClientTask implements Callable<String> {

    private String userId = null;

    public ClientTask(String userId) {
    this.userId = userId;
    }

    @Override
    public String call() throws Exception {

    //.....

    String hostname = ClientData.getPrimaryMapping("some_string").get(some_number);

    //....

    }   
}

这种方法的问题是,客户第一次调用我们的工厂来获取实例后,它将启动后台线程,该后台线程将从URL中获取数据并进行解析并将其存储在类变量中,但是它会立即调用read我的实现类方法。

现在可能第一次,我的后台线程仍在解析数据,但是实际的调用已经在里面了call method,然后它将尝试从getPrimaryMapping方法中获取数据,但将没有任何东西,对吧?为什么bcoz仍在解析数据。.因此,我如何确保在每次客户调用我们的代码时第一次进行解析,一旦解析完成,则只允许在call方法中获取变量值。

然后第二次就可以了。因为数据将存储在内存中,所以只有第一次才是问题。

有什么办法吗?

范·欧克尔

这不是一个很好的解决方案,但是CountDownLatch可以解决这个问题:

public class ClientData {

    private static final AtomicReference<Map<String, Map<Integer, String>>> primaryMapping = new AtomicReference<>();
    private static final CountDownLatch firstSet = new CountDownLatch(1);

    public static Map<String, Map<Integer, String>> getPrimaryMapping() {

        try { firstSet.await(); } catch (Exception ignored) {}
        return primaryMapping.get();
    }

    public static void setPrimaryMapping(Map<String, Map<Integer, String>> map) {

        primaryMapping.set(map);
        firstSet.countDown();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从地图中获取价值

来自分类Dev

如何从地图中获取值?

来自分类Dev

如何从地图中获取ID

来自分类Dev

使用ajax从传单地图中获取数据

来自分类Dev

如何在地图中获取价值的关键?

来自分类Dev

如何使用钩子从地图中获取索引?

来自分类Dev

如何获取地图中的字节值

来自分类Dev

如何获取地图中值的大小?

来自分类Dev

如何从 Elixir 地图中获取随机元素?

来自分类Dev

如何从 Json 获取特定数据并在 Ruby on Rails 中显示在 Google 地图中

来自分类Dev

如何在流口水的地图内从地图中获取值

来自分类Dev

不支持的操作异常-从地图中获取列表并向地图中添加数据

来自分类Dev

C ++-如何判断地图中是否存在键

来自分类Dev

如何检查Google地图中是否已经存在标记?

来自分类Dev

如何获取谷歌地图中地图中心的位置(LatLng /名称)

来自分类Dev

如何从地图中获取特定的键和值

来自分类Dev

如何获取Google地图中叠加图形的fillColor?

来自分类Dev

如何在Go中获取地图中的条目数?

来自分类Dev

如何以米为单位获取地图中图块的大小

来自分类Dev

更少:如何从地图中获取整个规则集

来自分类Dev

如何在Typescript中获取地图中值的类型?

来自分类Dev

如何在bing地图中获取LocationRect的面积(2的倍数)?

来自分类Dev

JsRender:如何使用指定的键从地图中获取值

来自分类Dev

如何从Google地方地图中获取经度和纬度?

来自分类Dev

如何获取我的.TMX地图中某些点的坐标?-LibGDX

来自分类Dev

如何在android地图中获取我当前的位置?

来自分类Dev

如何在谷歌地图中获取落点纬度和经度

来自分类Dev

如何将数据地图中的地图更改为世界地图的图像?

来自分类Dev

如何在python中的数据数组/地图中绘制圆

Related 相关文章

  1. 1

    如何从地图中获取价值

  2. 2

    如何从地图中获取值?

  3. 3

    如何从地图中获取ID

  4. 4

    使用ajax从传单地图中获取数据

  5. 5

    如何在地图中获取价值的关键?

  6. 6

    如何使用钩子从地图中获取索引?

  7. 7

    如何获取地图中的字节值

  8. 8

    如何获取地图中值的大小?

  9. 9

    如何从 Elixir 地图中获取随机元素?

  10. 10

    如何从 Json 获取特定数据并在 Ruby on Rails 中显示在 Google 地图中

  11. 11

    如何在流口水的地图内从地图中获取值

  12. 12

    不支持的操作异常-从地图中获取列表并向地图中添加数据

  13. 13

    C ++-如何判断地图中是否存在键

  14. 14

    如何检查Google地图中是否已经存在标记?

  15. 15

    如何获取谷歌地图中地图中心的位置(LatLng /名称)

  16. 16

    如何从地图中获取特定的键和值

  17. 17

    如何获取Google地图中叠加图形的fillColor?

  18. 18

    如何在Go中获取地图中的条目数?

  19. 19

    如何以米为单位获取地图中图块的大小

  20. 20

    更少:如何从地图中获取整个规则集

  21. 21

    如何在Typescript中获取地图中值的类型?

  22. 22

    如何在bing地图中获取LocationRect的面积(2的倍数)?

  23. 23

    JsRender:如何使用指定的键从地图中获取值

  24. 24

    如何从Google地方地图中获取经度和纬度?

  25. 25

    如何获取我的.TMX地图中某些点的坐标?-LibGDX

  26. 26

    如何在android地图中获取我当前的位置?

  27. 27

    如何在谷歌地图中获取落点纬度和经度

  28. 28

    如何将数据地图中的地图更改为世界地图的图像?

  29. 29

    如何在python中的数据数组/地图中绘制圆

热门标签

归档