Volley 增加线程池大小 Android

Volley Increasing ThreadPool Size Android

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

问题

  1. 在 Volley 中增加用于处理请求的线程池大小会如何影响应用程序的性能?我把它改成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);

}

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

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

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

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