当前位置: 首页 > 面试题库 >

执行器和PriorityBlockingQueue上的ASyncTask

诸葛彦
2023-03-14
问题内容

我正在尝试使一些ASyncTask优先运行。

我已经创建了一个带有PriorityBlockingQueue的ThreadPoolExecutor,并且该属性比较器对于标准Runnable来说效果很好。但是打电话时

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

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

我该如何解决?谢谢


问题答案:

从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);

在这里查看我的答案,看看我如何创建自己的AsyncTask来使executeOnExecutor()在API级别11之前工作。



 类似资料:
  • 问题内容: 是不受限制的,但我需要以某种方式进行限制。最好的方法是什么? 有关信息,有界将被用。 注意:如果发生这种情况,我不想抛出异常,我想将对象放入队列,然后根据其优先级值将其剪切。有什么好办法可以做到这一点吗? 问题答案: 我实际上不会继承它。尽管我现在无法将示例代码放在一起,但我建议使用装饰器模式的版本。 创建一个新类并实现您感兴趣的类实现的接口:PriorityBlockingQueue

  • 假设我有以下一组代码,可以在将来做一些事情: 假设我为这段代码提供了默认的ExecutionContext,我知道在后台会发生什么,但我想知道的是如何处理未来?我的意思是,应该有一些线程或一组线程可能会等待未来完成?这些线程被阻塞了吗?从某种意义上说,他们是在等待未来的结束? 现在在以下场景中: 假设x有一个超时,我可以这样调用: 我真的在阻挡吗?有没有更好的异步超时方法? 编辑:下面的超时比我上

  • 最近,我使用了ThreadPoolExecutor和priorityqueue,并在将来遇到了这两种方法。对未来任务执行cancel()。和任务。remove(),将其从队列中移除。 更好的选择是什么?有什么区别吗?我可以保存两者的列表(从submit()接收的未来对象或任务本身),不确定要使用什么。。。 移除: 取消: 我使用了以下方法:http://docs.oracle.com/javase

  • 我已经安装了MySQL 5.5。34,Apache2.2。15和PHP5.5。4在我的linux Redhat系统(2.6.32-220.17.1.el6.x86_64)上按各自的顺序排列。 当php脚本在web浏览器上运行时,它被apache解释为html,尽管它在命令行中运行良好。 我在httpd.conf文件中做了以下更改:我有未注释的LoadMoulesphp5_module模块/libp

  • 在EMR集群或任何集群中,YARN有可能在同一个EC2实例中分配驱动程序和执行器吗?我想知道驱动程序是否可以利用1个EC2实例的存储和处理能力,或者该实例的某个部分将用于服务集群中运行的其他spark作业。这可能会导致我的驱动程序内存不足。 我认为资源管理器是根据集群资源的可用性来决定的?

  • 我的问题是:如何在使用Log4j2时查看所有记录器的完整列表,而不在Spring-boot应用程序中进行登录? 编辑:这里是我的pom.xml