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

简单线程管理-Java-Android

谢哲瀚
2023-03-14
问题内容

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

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

如果我请求太多并发线程(我最多希望有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版本使用。

单击此处运行Google代码搜索AsyncTask-第一个匹配项应该是实现。

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



 类似资料:
  • 在日常生活中,我们要完成一个大任务,一般会将它分解成多个简单、容易解决的小问题,小问题逐个被解决,大问题也就随之解决了。在多线程操作系统中,也同样需要开发人员把一个复杂的应用分解成多个小的、可调度的、序列化的程序单元,当合理地划分任务并正确地执行时,这种设计能够让系统满足实时系统的性能及时间的要求,例如让嵌入式系统执行这样的任务,系统通过传感器采集数据,并通过显示屏将数据显示出来,在多线程实时系统

  • 线程管理接口 结构体 struct   rt_thread   线程控制块 更多...   宏定义 #define  RT_THREAD_INIT   0x00   初始化完成状态   #define  RT_THREAD_READY   0x01   就绪状态   #define  RT_THREAD_SUSPEND   0x02   挂起状态   #define  RT_THREAD_RUNN

  • 我对Java有点生疏,已经很久没有编写过类似的程序了。我正在尝试创建一个简单的停车场管理器程序,并实现以下类Vehicle和子类car,Van,Motorbike(这些扩展了Vehicle类)。Car class应该包含关于车门的编号和颜色的信息。面包车等级应包括关于面包车载货量的信息。等级摩托车应该有关于发动机大小的信息。该程序应该允许添加车辆到停车场,删除车辆,打印当前停放车辆的列表,并给出信

  • 因此,我有一个主线程,它产生了一堆“工作线程”,在整个过程中与它一起工作。我想要的是,如果一个工作线程死于异常或其他什么,主线程也应该抛出一个运行时异常并平静地死掉。 我想要的是,如果一个工作线程死于异常或其他什么,主线程也应该抛出一个运行时异常并平静地死掉,而不使用标志,但要“自动”完成

  • 本文向大家介绍Java GUI制作简单的管理系统,包括了Java GUI制作简单的管理系统的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java GUI管理系统的具体代码,供大家参考,具体内容如下 1.先完成主页面MainUI(代码如下) 运行图1   用户名和密码如下: 2.完成学生界面StuUI,这个页面在MainUI界面设置了按钮连接(代码如下) 运行MainUI输入用户学生

  • 用途: 提供一个管理进程的接口 multiprocessing Basics Importable Target Functions Determining the Current Process Daemon Processes Waiting for Processes Terminating Processes Process Exit Status Logging Subclassing