【问题标题】:Volley Increasing ThreadPool Size AndroidVolley 增加 ThreadPool 大小 Android
【发布时间】:2018-07-09 10:39:58
【问题描述】:

我在下面有这段代码,它发出 300 个 http 请求,每个请求从数据库返回 10000 行。 10000 的总大小约为 0.4mb。所以 300*0.4 = 120mb。

问题

  1. 增加用于处理 Volley 请求的 ThreadPool 大小会如何影响应用程序的性能?我改成12,但是执行时间和数据大小和4一样,有什么区别吗?
  2. 在增加 Volley 线程数时,结果数据是否也会增加?如果有 1 个线程,则每次返回的最大数据为 0.4mb。但如果我们有 4 个,则最大值为 1.6mb。

模拟器:4核多线程

ExecutorService service  = Executors.newFixedThreadPool(4);
RequestQueue queue;
AtomicInteger counter = new AtomicInteger(0);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    File cacheDir = new File(this.getCacheDir(), "Volley");
    queue = new RequestQueue(new DiskBasedCache(cacheDir), new BasicNetwork(new HurlStack()), 4);
    queue.start();
    start();
}



public void start(){

    String url ="...";
    for(int i =0 ; i<300; i++) {
        counter.incrementAndGet();
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        method(response);
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("VolleyError", error.toString());
            }
        });
        stringRequest.setTag("a");
        queue.add(stringRequest);
    }
}

public synchronized void decreased(){

    if(counter.decrementAndGet()==0)
        start();
}

public void method( String response){

        Runnable task = new Runnable() {
            @Override
            public void run() {

                List<Customer> customers= new ArrayList<>();
                ObjectMapper objectMapper = new ObjectMapper();
                TypeFactory typeFactory = objectMapper.getTypeFactory();
                try {
                customers= objectMapper.readValue(response, new TypeReference<List<Customer>>() {});

                              //Simulate database insertion delay
                              try {
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                   e.printStackTrace();
                                }

                    decreased();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        };


    logHeap("");
    service.execute(task);

}

【问题讨论】:

    标签: android android-volley


    【解决方案1】:

    关于问题 1: 与 12 相比,大小为 4 的线程池会更好。 线程池大小应与可用处理器的数量相结合。

    由于处理器数量有限,应用不应产生不必要的线程,因为这可能会导致性能问题。由于 android 操作系统必须管理更多线程之间的资源,这将导致每个线程的等待时间和实际时间增加。

    理想情况下,假设您的线程没有锁定,因此它们不会相互阻塞(彼此独立),并且您可以假设工作负载(处理)相同,那么事实证明,池大小为Runtime.getRuntime().availableProcessors() or availableProcessors() + 1 给出了最好的结果。 更多信息请参考链接Setting Ideal size of Thread Pool

    关于问题2:如果我正确理解了您的问题,返回的数据应该没有变化,因为线程池大小对网络负载没有影响,只有等待时间和实际时间会改变,当线程池大小值为改变了。

    【讨论】:

    • 我们不要“假设”任何事情,而是专注于这里的主要问题。我说的是专门的排球。我不知道线程是否相互阻塞。
    • 在 volley 的情况下,线程池大小应该接近可用处理器,创建更多线程也会产生不必要的开销。
    • “线程池大小对网络负载没有影响”。但是线程池会解析来自服务器的响应,然后将它们发送到主线程。因此,如果我们有 12 个线程,则将解析 12 个并发响应并将其发送到主线程。所以如果主线程不够快来执行响应,内存将不断上升。我说的对吗?
    • 所有12个线程不会同时处于RUNNING状态,因为线程在处理器上运行,最多Runtime.getRuntime().availableProcessors()处于运行状态,其他处于等待状态.
    • 好的。最后一个问题。网络延迟是否也会影响性能?如果响应很慢,4 线程将与 1 一样好。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2014-10-15
    相关资源
    最近更新 更多