gpt4 book ai didi

java - Executor 和 PriorityBlockingQueue 上的 ASyncTask

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:01 25 4
gpt4 key购买 nike

我正在尝试让一些 ASyncTask 以优先级同时运行。

我创建了一个带有 PriorityBlockingQueue 的 ThreadPoolExecutor,propper 比较器非常适合标准 Runnable。但是调用的时候

    new Task().executeOnExecutor(threadPool, (Void[]) null);

PriorityBlockingQueue 的比较器接收 ASyncTask(在源代码中称为 mFuture)内部的 Runnable(私有(private)),因此在比较器中我无法识别 runnable 或读取“优先级”值。

我该如何解决?谢谢

最佳答案

android.os.AsyncTask借用源代码并制作您自己的 com.company.AsyncTask 实现,您可以在其中控制自己代码中的所有内容。

android.os.AsyncTask 带有两个现成的执行器,THREAD_POOL_EXECUTOR 和 SERIAL_EXECUTOR:

private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(10);

/**
* An {@link Executor} that can be used to execute tasks in parallel.
*/
public static final Executor THREAD_POOL_EXECUTOR
= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);

/**
* An {@link Executor} that executes tasks one at a time in serial
* order. This serialization is global to a particular process.
*/
public static final Executor SERIAL_EXECUTOR = new SerialExecutor();

在您的 com.company.AsyncTask 中,创建另一个 PRIORITY_THREAD_POOL_EXECUTOR 并将您的所有实现包装在此类中(您对所有内部字段具有可见性),并像这样使用您的 AysncTask:

com.company.AsyncTask asyncTask = new com.company.AsyncTask();
asyncTask.setPriority(1);
asyncTask.executeOnExecutor(com.company.AsyncTask.PRIORITY_THREAD_POOL_EXECUTOR, (Void[]) null);

查看我的回答 here并查看我如何创建自己的 AsyncTask 以使 executeOnExecutor() 在 API 级别 11 之前工作。

关于java - Executor 和 PriorityBlockingQueue 上的 ASyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12039596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com