11_Android的线程和线程池

Android的线程和线程池

1、主线程和子线程

线程在Android中是一个很重要的概念,从用途上来说,线程分为主线程和子线程,主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时操作。由于Android的特性,如果在主线程中执行耗时操作那么就会导致程序无法及时响应,因此耗时操作必须放在直线成功中去执行。撤了Thread本身以外,在Android中扮演线程角色的还有AsynTask、IntentService、HandlerThread

AsynTask封装了线程池和Handler,它主要是为了方便开发者在子线程中更新UI。HandlerThread是一种具有消息循环的线程,在它内部可以使用Handler。IntentService内部采用了HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出。

当系统中存在大量的线程时,系统会通过时间片轮转的方式调度每个线程,因此线程不可能做到绝对的并行,除非线程数量小于等等CPU的核心数,一般来说不可能的。

采用线程池,这个线程池中会缓存一定数量的线程,通过线程池就可以避免因为频繁创建和销毁线程所带来的系统开销。

主线程是指进程所拥有的线程,在Java中默认情况下一个进程只有一个线程,这个线程就是主线程。主线程的作用是运行四大组件以及处理它们和用户的交互,而子线程的作用则是执行耗时操作。比如:网络请求、IO操作等。

2、Android中的线程形态

AsynTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。AsynTask并不适合进行特别耗时的后台任务,对于特别耗时的任务来说,建议使用线程池。

AsynTask是一个抽象的泛型类,它提供了Params、Progress和Result这三个泛型参数,其中Params表示参数的类型,Progress表示后台任务的执行进度的类型,而Result则表示后台任务的返回结果的类型。

onPreExecute():在主线程中执行,在异步任务执行之前,此方法会被使用,一般可以用于做一些准备工作。

doInBackground(Params ...params):在线程池中执行,此方法用于执行异步任务,params参数表示异步任务的输入参数。在此方法中可以通过publishProgress方法来更新任务的进度,publishProgress方法会调用onProgressUpdate方法。

onProgressUpdate(Progress ... values):在主线程中执行,当后台任务的执行进度发生改变时此方法会被调用。

onPostExecute(Result result):在主线程中执行,在异步任务执行之后,此方法会被调用,其中result参数时后台的返回值,即doInBackground的返回值。

HandlerThread:继承于Thread,它是一种可以使用使用Handler的Thread。

IntentService:IntentService是一种特殊的Service,它继承了Service并且它是一个抽象类。IntentService可用于执行后台耗时的任务,当任务执行后它会自动停止,同时由于IntentService是服务的原因,这导致它的优先级比较单纯的线程优先级要高很多,所有IntentService比较适合执行一些高优先级的后台任务,因为它优先级高,不同意被系统杀死。在实现上,IntentService封装了HandlerThread和Handler。

3、Android中的线程池

1)、使用线程池的好处:

①:重用线程池中的线程,避免因为线程的创建和销毁说带来的性能开销

②:能有效控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象

③:能够对线程进行简单的管理,并提供定时执行以及制定间隔循环执行等功能

Android中线程池的概念来源于Java中的Executor,Executor是一个接口,真正的实现为ThreadPoolExecutor。ThreadPoolExecutor提供了一系列参数可以创建不同的线程池。从线程池的功能特性上说,Android的线程池分类4类,这4类线程池可以通过Executors说提供的工厂方法来得到。

2)、线程池的分类

①:FixedThreadPool:通过Executors的newFixedThreadPool方法创建,它是一种线程数量固定的线程池,当线程处于空闲状态时,它们并不会回收,除非线程池被关闭了。由于FixedThreadPool只有核心线程并且这些核心县城关不会被回收,这就意味着它能够更加快速地响应外界的请求。

②、CachedThreadPool:通过Executors的newCachedThread方法创建。它是一种线程数量不定对的线程池,它只有非核心线程,并且最大线程数为Integer.MAX_VALUE。当线程池中的线程都处于活动状态时,线程池会创建新的线程来处理新任务,否则就会利用空闲的线程来处理新任务。线程池中空闲线程都有超时机制,这个超时时长为60秒。

③、ScheduledThreadPool:通过Executors德尔newScheduledThread方法来创建。它的核心线程数是固定的,而非核心线程数是没有限制的,并且当非核心线程闲置时会被立即回收。ScheduledThreadPool这类线程池主要用于执行定时任务和具有固定周期的重复任务。

④、SingleThreadExecutors:通过Executors的newSingleThreadExecutors方法创建。这类线程池内部只有一个核心线程,它确保所有的任务都在同一个线程中按顺序执行。SingleThreadExecutors的意义在于统一所有的外界任务到一个线程中,这使得在这些任务之间不需要处理线程同步的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值