CachedThreadPool与FixedThreadPool

时间:2016-03-08 05:22:19

标签: java android multithreading threadpool

我想知道在这个特定场景中使用CachedThreadPoolFixedThreadPool的内容。 当用户登录应用程序时。将获得关于10个地址的地址列表。我需要做以下事情:

  1. 将地址转换为我称之为google api
  2. 的纬度和经度
  3. 在谷歌的帮助
  4. 的帮助下,获取上述获取的纬度和经度与用户当前位置之间的距离

    所以我创建了一个实现GetDistance的类Runnable - 在这个类中我首先调用google api并解析resposne以获得相应的经度和经度,然后调用并解析另一个的结果谷歌api以获得驾驶距离。

    private void getDistanceOfAllAddresses(List<Items> itemsList) {
        ExecutorService exService = newCachedThreadPool(); //Executors.newFixedThreadPool(3);
        for(int i =0; i<itemsList.size(); i++) {
            exService.submit(new GetDistance(i,usersCurrentLocation));
        }
        exService.shutdown();
    
    }
    

    我已尝试同时使用CachedThreadPoolFixedThreadPool - 所用的时间几乎相同,我也支持CachedThreadPool,因为它建议用于小型操作,但我担心的是 - 让我们假设{{1创建10个线程(最坏的情况)来完成这个过程(10个项目)如果我的应用程序在低端设备上运行会是一个问题吗?由于创建的线程数也会影响设备的RAM。

    想了解您对此的想法和意见。哪个更好用?。

    谢谢

1 个答案:

答案 0 :(得分:3)

使用newCachedThreadPool它更适合这种情况,因为您的任务很小且I / O(网络)受限。这意味着您应该创建比处理器核心数量更多的线程(通常是1.5x~2x倍)以获得最佳输出,但在这里我想newCachedThreadPool将自行管理。因此,与newCachedThreadPool相比,newFixedThreadPool的开销会减少,并且会对您的情况有所帮助。

如果你有CPU密集型任务,那么newFixedThreadPool可能是更好的选择。

<强>更新

  

将获得大约10个地址的地址列表。

如果您总是只需要10个地址,则无关紧要,请使用newCachedThreadPool。但是,如果您认为地址数量可以增加,那么使用newFixedThreadPool和线程数&lt; = 1.5x到2x倍可用核心数。

来自Java docs:

newFixedThreadPool

  

创建一个重用a的线程池   固定的线程数量   共享的无界队列。在任何   一点,最多nThreads线程会   是积极的处理任务。如果   其他任务在提交时提交   所有线程都处于活动状态,它们将等待   在队列中直到一个线程   可用。如果任何线程终止   由于执行期间的失败   在关机之前,新的将采取   如果需要执行它的位置   后续任务。中的线程   池将一直存在,直到它明确   关掉。

newCachedThreadPool

  

创建一个创建新的线程池   线程根据需要,但将重用   以前构造的线程   它们可用。这些池会   通常可以提高性能   执行许多短命的程序   异步任务。要求执行   将重用以前构建的   线程如果可用。如果没有   线程可用,新线程将   创建并添加到池中。   未使用的线程   60秒终止了   从缓存中删除。因此,一个游泳池   仍然闲置足够长的意志   不消耗任何资源。注意   具有相似属性的游泳池但是   不同的细节(例如,   可以创建超时参数)   使用ThreadPoolExecutor构造函数。