美文网首页Android
Android的线程和线程池

Android的线程和线程池

作者: 和莱 | 来源:发表于2020-03-22 11:33 被阅读0次

除了Thread,在Android中扮演线程角色的还有AsyncTask、HandleThread、intentService。它们的底层都用到了线程。AsyncTask封装了线程池和Handle,用于在子线程中更新UI,ThreadHandle中使用了Handle,IntentService是一种服务,比线程优先级更高,可以执行优先级更高的后台任务而不会被操作系统杀死。

AsyncTask

AsyncTask是一种轻量级异步任务,它可以在线程池中执行异步任务,然后将执行进度和执行结果传递给主线程,在主线程中更新UI,AsyncTask是一个抽象的泛型类,需要三个泛型参数,Params、Progress、Result,它提供了四个核心方法:onPreExecute,在主线程中执行,在执行异步任务前调用此方法,做一些准备工作;doInBackground,在线程池中执行,用于执行具体的异步任务;onUpdateProgress,在主线程中执行,当任务进度发生改变时调用此方法,更新任务进度;onPostExecute,异步任务结束以后调用此方法,在主线程中执行。

AsyncTask的工作原理是在UI线程中调用它的execute方法,这个方法又会调用executeOnExecute方法,然后这个方法在调用了onPreExecute方法之后,又会调用线程池的execute方法,将任务交到线程池中执行。异步任务默认是串行执行的。执行完毕之后postResult方法会使用UI的Handle将线程切换到主线程中执行。
为了让AsyncTask在Android3.0以上的版本并行执行,可以使用executeOnExecute方法。

HandleThread

是一种可以使用Handle的线程,在run方法中调用Looper的prepare方法创建消息循环系统,调用loop方法开启消息循环,在实际的使用中就可以Handle了,外部线程可以使用这个Handle来给这个线程发送执行具体任务的消息。

IntentService

是一种特殊的服务,它继承了Service,但还是一个抽象类,必须创建它的子类才能使用,它封装了HandleThread和Thread,当IntentService对象第一次被创建的时候,onCreate方法会创建一个HandleThread,其他线程通过它的Handle将耗时任务发送给它来执行,每次启动IntentService,它的onStartCommand方法就会执行,这个方法调用onStart方法,onStart方法中通过Handle会调用sendMessage方法向消息队列中添加任务,Handle会调用onHandleIntent方法处理这个消息,处理完毕消息之后调用stopSelf(ID)结束。

线程池

线程池的概念来自Java的Executor类,在Android中真正可以实现线程池的是ThreadPoolExecutor,构造函数参数有corePoolSize,核心线程数量,在默认情况下核心线程会一直存活,但是如果将allowCoreThreadTimeOut属性设置为true的话,在超时以后也会被销毁;maximumPoolSize,线程池最大线程数,当已有线程到达这个值时,新的任务会被阻塞;keepAliveTime,普通线程闲置时的存活时间,如果将allowCoreThreadTimeOut设置为true的话,也适用于核心线程;unit是时间单位;workQueue,存储通过线程池的execute方法提交的Runnable对象;threadFaxtory,为线程池提供创建线程的功能,它是一个接口,只有thread new Thread(Runnable)一个方法,RejectExeceptionHandle参数,当线程池无法执行新的任务时,会抛出此错误。
执行任务时的调用规则:如果核心线程有空闲,将任务交给核心线程执行,如果核心线程没有空闲但是任务队列未满,将任务阻塞到队列中,如果队列已经满了,但是线程池中的线程数量未达到最大值,可以创建其他线程执行这个任务,如果线程已经到达最大数量,拒绝这个任务,并通知调用者。

线程池的分类:
fixedThreadPool,线程数量固定,处于空闲状态也不销毁;
cacheThreadPool,线程数量不限,可以创建最大值的线程,但是没有核心线程;
SecheduleThreadPool,核心线程固定,非核心线程不限;
singleThreadExecuteor,只有一个线程的线程池;

相关文章

  • Android线程池的使用

    一、线程与线程池,为什么要使用线程池 1、Android中的线程 在Android中有主线程和子线程的区分。主线程...

  • Android的线程和线程池

    Android的线程和线程池 标签(空格分隔): android 一些概念: 线程分类:主线程和子线程,主线程主要...

  • 笔记:Android线程和线程池

    Android线程和线程池 Android中的线程操作相关的类有 AsyncTask IntentService ...

  • 线程池创建和相关知识

    线程池创建(单例):Android线程池得要这么用 - 简书 线程池相关知识:Android开发之线程池使用总结 ...

  • Android面试之线程和线程池

    Android中的线程形态 AsyncTask底层用到了线程池。AsyncTask封装了线程池和Handler,它...

  • <> Chapter 11

    Android的线程和线程池 主线程和子线程 Android中的主线程也叫UI线程,主要作用是运行四大组件以及处理...

  • Android 的线程和线程池

    Android 的线程分为主线程和子线程。 主线程更新 UI 子线程执行耗时操作 AsyncTask封装了线程池和...

  • 线程池

    话题:线程池Android中的线程池有哪些?它们的区别是什么?为什么要使用线程池? 线程是Android里面一个很...

  • 要点提炼|开发艺术之线程

    本篇的主要内容是Android的线程和线程池: 概述 线程形态AsyncTaskHandlerThreadInte...

  • Android 开发艺术探索读书笔记 11 -- Android

    本篇文章主要介绍以下几个知识点:主线程和子线程Android 中的线程形态Android 中的线程池 11.1 主...

网友评论

    本文标题:Android的线程和线程池

    本文链接:https://www.haomeiwen.com/subject/lnsmyhtx.html