Android中的线程池

来源:互联网 发布:舒尔特表训练软件 编辑:程序博客网 时间:2024/05/17 07:04

一、线程分类

1、线程分主线程和子线程

主线程:主要处理和界面相关的操作

子线程:负责处理一些耗时的操作;

二、Android中的线程形态

AsyncTask:封装了线程池和Handler,主要是为了方便开发者在子线程中更新UI,不适合进行特别耗时的操作

HandlerThread:是一种具有消息循环的线程,在它的内部可以使用Handler

IntentService:可用于执行后台耗时的任务,因为它的优先级高不容易被系统杀死,所以比较适合执行一些高优先级的后台任务

三、线程池的优点有以下三点

1、重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销。

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

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

四、线程池的真正实现:ThreadPoolExecutor

五、常见四类具有不同功能特性的线程池

1、FixedThreadPool

a、线程数量固定

b、只有核心线程,且没有超时机制,不会被回收,其意味着能够加速的响应外界的请求

c、所有线程处于活动状态时,新任务处于等待状态,直到有线程空闲出来

d、线程处于空闲状态时,不会被回收,除非线程池被关闭

2、CachedThreadPool

a、线程数量不定

b、只有非核心线程,最大线程数可以任意大(Integer.MAX_VALUE)

c、所有线程处于活动状态时,会创建新的线程来处理新任务,否则会利用空闲的线程来处理新任务

d、线程处于空闲状态时,超过60秒闲置线程会被回收

e、整个线程池都处于闲置状态,线程池中的线程都会超时,此时CachedThreadPool之中实际上是没有任何线程,几乎不占用任何系统资源

f、任务队列是一个空集合,这导致任何任务都会被立即执行

g、适合执行大量的耗时较少的任务

3、ScheduledThreadPool

a、核心线程数量固定,非核心线程数无限制,且非核心线程闲置时会立即被回收

b、主要用于执行定时任务和具有固定周期的重复任务

4、SingleThreadExecutor

a、只有一个核心线程,确保所有任务都在同一线程中按顺序执行

b、意义在于统一所有的外界任务到一个线程中,使得任务之间不用处理线程同步问题

 四类线程池代码实现如下

Runnable command =new Runnable(){

         @Override

         public void run(){

                  SystemClock.sleep(2000);

         }

}

 

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);

fixedThreadPool.exceute(command);

 

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

cachedThreadPool.execute(command);

 

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);

//2000ms后执行command

scheduledThreadPool.schedule(command,2000, TimeUnit.MILLISECONDS);

//延时10ms后,每隔1000ms执行一次command

scheduledThreadPool.scheduleAtFixedRate(command,10, 1000, TimeUnit.MILLISECONDS);

 

ExecutorServicesingleThreadExecutor = Executors.newSingleThreadExecutor();

singleThreadExecutor.execute(command);

0 0
原创粉丝点击