简单的线程管理 - Java - Android

gav*_*gav 8 java multithreading android

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

这是我所拥有的唯一类型的任务,并且所有任务都同等重要.

如果我要求太多并发线程(我想要的最大值是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

只需将被拒绝的任务添加到队列中,下次启动线程时,将检查队列以查看是否存在待办事项.

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

只是想知道我是否应该使用一个简单的模型来管理这类事情.我需要任务在完成后通知队列,所以我知道有空间,但我不确定如何.

亲切的问候,

加文

Com*_*are 12

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

因此,一种可能性是你克隆AsyncTask,提高限制(或无限制,这也是可能的LinkedBlockingQueue),并使用你的克隆.然后,也许,将更改作为补丁提交AsyncTask给未来的Android版本.

点击此处运行Google代码搜索AsyncTask- 首先应该是实施.

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

  • 限制不再是10.限制已经到位,因为AsyncTasks不打算被十几个人解雇.由于这样的任务的目标是更新UI,因此有几十个线程导致更新会非常糟糕. (15认同)