Android的线程和线程池

来源:互联网 发布:如何设计软件 编辑:程序博客网 时间:2024/06/07 01:33

一、Android中的线程形态

1、Thread:在run方法中执行耗时任务

2、AsyncTask:

1)、封装了Thread和Handler,用于执行后台任务并在主线程中访问UI,不适合特别耗时的后台任务。

2)、提供了3个泛型参数:Params表示参数类型、Progress表示后台任务执行进度的类型、Result表示后台任务返回结果的类型

3)、提供了4个核心方法:
a、onPreExecute():主线程中执行,异步任务执行前调用,做一些准备工作

b、doInBackground(Params ...  params):线程池中执行,用于执行异步任务,params为异步任务的输入参数。方法中可通过publishProgress方法,调用onProgressUpdate方法更新任务进度;返回计算结果给onPostExecute。

c、onProgressUpdate(Progress ...  values):主线程执行,后台任务的执行进度发生改变时调用

d、onPostExecute(Result result):主线程执行,异步任务执行后调用。

e、onCanceled():

4)、使用new MyAsyncTask().execute(params)。

5)、条件:

a、该类在主线程中加载

b、对象在主线程中创建

c、executie方法在UI线程调用

d、不可调用内部的方法

e、一个对象只能调用一次execute方法

f、使用executeOnExecutor方法并行执行任务

6)、原理

3、HandlerThread:

1)、在run方法中创建消息队列并开启消息循环,从而允许在HandlerThread中创建Handler。

2)、由于在内部创建了消息队列,外界通过Handler的消息方式通知HandlerThread执行具体任务。

3)、当明确不需要再使用时,要使用quit或者quitSafely来退出run的无限循环。

4、IntentService:

1)、可执行后台耗时任务,完成后自动停止;由于是服务,所以具有更高的优先级,不易被系统杀死。

2)、封装了HandlerThread和Handler

3)、使用

a、onHandleInt()方法

二、Android中的线程池

1、线程池优点:

1)、重用线程池中的线程

2)、控制线程池的最大并发数,避免线程之间抢占资源导致的阻塞现象

3)、对线程简单管理,提供定时执行及指定间隔循环执行等功能

2、线程池的实现

1)、ThreadPoolExecutor

a、线程池中线程数未达到核心线程的数量,会启动一个核心线程执行任务

b、线程池中线程数已达到核心线程的数量,会将任务插入到任务队列中等待执行

c、如果任务队列已满,b中无法将任务插入到任务队列中,若此时线程数未达到最大线程的数量,会立刻启动一个非核心线程来执行任务

d、如线程数已达到最大线程的数量,会拒绝执行此任务

2)、AsyncTask中线程池的配置信息

a、核心线程数:CPU数+1

b、最大线程数:CPU数的2倍+1

c、核心线程无超时机制,非核心线程在闲置时超时时间1秒

d、任务队列容量128

3)、线程池的分类

a、FixedThreadPool

b、CachedThreadPool

c、ScheduleThreadPool

d、SingleThreadPool

0 0
原创粉丝点击