理解android中的并行异步任务

理解android中的并行异步任务,android,multithreading,android-asynctask,threadpool,Android,Multithreading,Android Asynctask,Threadpool,在我的应用程序中,我在许多地方使用异步任务,最近我遇到了以下异步任务的doInBackground没有被调用的问题,这是在我第三次执行以下异步任务时发生的(其他异步任务也在运行) 我运行的是Android版本4.4.3 如何找出我的应用程序中当前正在运行的同步任务数?Bcz我想核心池大小计数可能是导致问题的原因 或者,如果发生死锁或任何其他情况并阻止执行新的异步任务,android studio中是否有方法识别并杀死其他可能没有用处的异步任务 如果我将CustomThreadPoolExecut

在我的应用程序中,我在许多地方使用异步任务,最近我遇到了以下异步任务的doInBackground没有被调用的问题,这是在我第三次执行以下异步任务时发生的(其他异步任务也在运行)

我运行的是Android版本4.4.3

  • 如何找出我的应用程序中当前正在运行的同步任务数?Bcz我想核心池大小计数可能是导致问题的原因

  • 或者,如果发生死锁或任何其他情况并阻止执行新的异步任务,android studio中是否有方法识别并杀死其他可能没有用处的异步任务

  • 如果我将CustomThreadPoolExecutor用作disconnectTask.executeOnExecutor(MCUSTOMSThreadPoolExecutor);随着CorePoolSize的增加,其工作正常,但下一个使用AsyncTask.THREAD\u POOL\u EXECUTOR的异步任务的doInBackground()未被调用


  • 当您多次运行
    AsyncTask
    时,它们都在同一线程上的队列中运行,因此直到一个任务没有完成,下一个任务才会启动

    因为你永远不会完成任务…下一个任务不会开始


    查看一下

    当您多次运行
    AsyncTask
    时,它们都在同一线程上的队列中运行,因此直到一个任务没有完成,下一个任务才会开始

    因为你永远不会完成任务…下一个任务不会开始


    看一看

    你好,谢谢种马和royB的重播……我找到了导致问题的原因

    多个异步任务的条件如下:

    在甜甜圈之前(直到1.6版)

    甜甜圈和蜂巢后(1.6–3.0)

    蜂巢和果冻豆后(版本3.0–4.3.1)

    private static final int CORE\u POOL\u SIZE=5;
    私有静态最终整数最大池大小=128;
    private static final BlockingQueue sPoolWorkQueue=new LinkedBlockingQueue(10);
    
    来自KitKat(上面的4.4):

    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
    private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
    private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
    private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128);
    
    private static final int CPU_COUNT=Runtime.getRuntime().availableProcessors();
    私有静态最终整数核心池大小=CPU计数+1;
    私有静态最终整数最大池大小=CPU计数*2+1;
    private static final BlockingQueue sPoolWorkQueue=new LinkedBlockingQueue(128);
    
    当我在Android版本4.4.3上运行时,我使用了Runtime.getRuntime().availableProcessors();要在我的日志中打印CPU计数,它显示2所以2+1=3是我设备的核心池大小, 从下面的studio调试器控制台中可以看到

    同时,我的设备中只能运行3个线程,因为这些线程已经被占用(正在运行)。。当我在doInbackground()方法中使用while循环时,这些异步任务从未完成,所以新的异步任务将进入队列,并且没有得到要执行的线程。 现在,我已经确保异步任务在其工作结束后立即正确终止。在我的修复之后,你可以在下面看到异步任务(线程)可用(处于等待状态)来执行新任务


    你好,谢谢种马和royB的重播……我找到了导致问题的原因

    多个异步任务的条件如下:

    在甜甜圈之前(直到1.6版)

    甜甜圈和蜂巢后(1.6–3.0)

    蜂巢和果冻豆后(版本3.0–4.3.1)

    private static final int CORE\u POOL\u SIZE=5;
    私有静态最终整数最大池大小=128;
    private static final BlockingQueue sPoolWorkQueue=new LinkedBlockingQueue(10);
    
    来自KitKat(上面的4.4):

    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
    private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
    private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
    private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128);
    
    private static final int CPU_COUNT=Runtime.getRuntime().availableProcessors();
    私有静态最终整数核心池大小=CPU计数+1;
    私有静态最终整数最大池大小=CPU计数*2+1;
    private static final BlockingQueue sPoolWorkQueue=new LinkedBlockingQueue(128);
    
    当我在Android版本4.4.3上运行时,我使用了Runtime.getRuntime().availableProcessors();要在我的日志中打印CPU计数,它显示2所以2+1=3是我设备的核心池大小, 从下面的studio调试器控制台中可以看到

    同时,我的设备中只能运行3个线程,因为这些线程已经被占用(正在运行)。。当我在doInbackground()方法中使用while循环时,这些异步任务从未完成,所以新的异步任务将进入队列,并且没有得到要执行的线程。 现在,我已经确保异步任务在其工作结束后立即正确终止。在我的修复之后,你可以在下面看到异步任务(线程)可用(处于等待状态)来执行新任务

    There was no concept of Multiple AsyncTask.
    
    Here it uses multiple AsyncTask in parallel by default and you cannot customize it.
    
    private static final int CORE_POOL_SIZE = 5;
    private static final int MAXIMUM_POOL_SIZE = 128;
    private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10);
    
    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
    private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
    private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
    private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128);