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

标签 java android multithreading

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

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

如果我请求过多的并发线程(我想要的最大值是 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/

相关文章:

c# - 了解 CLR 2.0 内存模型

android - 在 XML 中设置工具栏 Logo

python - 如何使用python启动两个线程?

java - Cygwin 运行的 java 版本与 windows powershell 不同

java - 声明具有常量查询值的改造 REST 端点

android - 导入 android.view.View;无法解析符号 'view'

java - Android:在连接到同一台机器的不同模拟器/真实设备上运行不同的测试

Java - TCP - 多线程服务器 - 如何处理多个客户端连接?

java - 我需要单击名为“使用 java 中的 selenium webdriver 注册新闻通讯”的复选框

c# - .Net 与 Java 垃圾收集器