android中常用的异步任务有哪些?
线程之间执行同一个任务怎么共享内存?线程之间执行不同任务怎么共享内存?
AsyncTask,HandlerThread,IntentService,线程池
1 AsyncTask
内部封装了线程池和Handler,主要用于执行异步任务时,将执行的进度和结构post到主线程,方便更新UI
泛型抽象类AsyncTask<param,progress,result>主要有4个方法需要实现,三个泛型分别表示:任务参数,执行进度,返回结果。四个方法分别为:onPreExecute(),onProgressUpdate(Object... values), doInBackground(Object... objects), onPostExecute(Object o), doInBackground在线程池中执行,其他三个方法在主线程主执行。
注释:asynctask内部含有handler,需要在主线程开启。调用publishProgress,onProgressUpdate方法会被回调。aynctask的excute方法串行执行,excuteOnExcutor并行执行,如果并行执行任务需要注意线程安全问题。
public static final Executor SERIAL_EXECUTOR = new SerialExecutor();
private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;
/**
* An {@link Executor} that executes tasks one at a time in serial
* order. This serialization is global to a particular process.
*/
public final AsyncTask<Params, Progress, Result> execute(Params... params) {
return executeOnExecutor(sDefaultExecutor, params);
}
2 HandlerThread
①封装有消息循环队列线程,可以在其中穿件handler。
注释handlerthread的run方法中由无线循环,终止线程的调用quit或者quitSafely。
3 IntentService
①内部封装了HandlerThread和handler主要用于执行后台任务②提高任务的进程优先级,不容易被系统杀死
abstract IntentService中的方法
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
public void onCreate() {
// TODO: It would be nice to have an option to hold a partial wakelock
// during processing, and to have a static startService(Context, Intent)
// method that would launch the service & hand off a wakelock.
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
4 线程,线程池
①线程之间怎么共享变量?
如果执行相同的任务可以将共享变量封装到runnable中,如果不同任务,可以将共享变量封装到类中,将对象传递给不同的线程访问。
②线程池的作用?
②①可以重用线程,减少线程创建和销毁所消耗的性能。
②②可以对线程进行管理,(如控制最大并发数,避免大量线程争夺系统资源。控制线程定时和间隔执行。)
③线程池
线程池的接口Executor,实现类是ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize, long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable>workQueue, ThreadFactory
threadFactory,RejectedExecutionHandler handler)
corePoolSize:核心线程数,线程任务到来时,如果线程数量没有达到核心线程数量,则创建新线程,如果达到,加入任务队列;如果allowCoreThreadTimeOut属性为true,空闲核心线程超过keepAliveTime时间会销毁,
maximumPoolSize: 设定线程池所允许创建的最大线程数。
keepAliveTime:非核心空闲线程存活存活时间,如果allowCoreThreadTimeOut属性为true,同时也作用于核心线程。
unit:keepAliveTime存活时间单位。
workQueue:任务队列,提交的runnable任务存储到该队列中。
threadFactory: threadFactory为借口,需要实现其方法newThread来创建线程。
handler: RejectedExecutionHandler为接口,有四个实现类AbortPolicy ,CallerRunsPolicy ,DiscardOldestPolicy, DiscardPolicy,默认为AbortPolicy,当线程数量达到maximumPoolSize时,由handler抛出RejectedExecutionException异常。
④线程池运行时所遵循的规则:
④①有任务时,线程数未达到核心线程数,则创建新线程执行任务,达到或超出最大核心线程数,则加入任务队列
④②如果任务队列已满,则创建非核心线程来执行任务。
④③如果非核心线程数量达到最大值,默认抛出RejectedExecutionException异常。