gpt4 book ai didi

java - 简单的线程管理 - Java - Android

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:58:01 24 4
gpt4 key购买 nike

我有一个应用程序,当用户要求过滤图像时会生成一个新线程。

这是我唯一的任务类型,所有任务都同等重要。

如果我请求过多的并发线程(我想要的最大值是 9),线程管理器会抛出一个 RejectedExecutionException

此刻我所做的是;

// Manage Concurrent Tasks
private Queue<AsyncTask<Bitmap,Integer,Integer>> tasks = new LinkedList<AsyncTask<Bitmap,Integer,Integer>>();

@Override
public int remainingSize() {
return tasks.size();
}

@Override
public void addTask(AsyncTask<Bitmap, Integer, Integer> task) {
try{
task.execute(currentThumbnail);
while(!tasks.isEmpty()){
task = tasks.remove();
task.execute(currentThumbnail);
}
} catch (RejectedExecutionException r){
Log.i(TAG,"Caught RejectedExecutionException Exception - Adding task to Queue");
tasks.add(task);
}
}

只需将被拒绝的任务添加到队列中,下次启动线程时,将检查队列以查看是否存在积压。

这个明显的问题是,如果最终任务在第一次尝试时被拒绝,它将永远不会重新启动(直到不再需要它之后)。

只是想知道我是否应该使用一个简单的模型来管理这类事情。我需要任务在完成时通知队列。

最佳答案

RejectedExecutionException 的原因是因为 AsyncTask 实现了自己的线程池(根据 Martelli 先生的回答),但线程池的上限为 10同时执行的任务。为什么他们有这个限制,我不知道。

因此,一种可能性是您克隆 AsyncTask,提高限制(或不受限制,这对于 LinkedBlockingQueue 也是可能的),然后使用您的克隆。然后,或许可以将更改作为补丁提交给 AsyncTask,以供将来的 Android 版本使用。

点击hereAsyncTask 运行 Google 代码搜索——第一个命中应该是实现。

如果您只想提高限制,请将 MAXIMUM_POOL_SIZE 调整为您可能需要的大小。如果您想不受限制,请使用零参数 LinkedBlockingQueue 构造函数,而不是目前使用的构造函数。 AFAICT,其余代码可能保持不变。

关于java - 简单的线程管理 - Java - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/990948/

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