赞
踩
(一)多线程
1,概念介绍
一般一个应用至少一个进程,一个线程,线程是进程的一个实体,是CPU调度和分派的基本单位.
最简单的比喻多线程就像火车的每一节车厢,而进程则是火车。车厢离开火车是无法跑动的,同理火车也不可能只有一节车厢。
在操作系统中,线程是最小的调度单元,同时又是一种受限的资源,所以不可能无限制的产生,它的创建和销毁都是比较耗性能的.
因此,要尽量使用线程池,来管理线程,避免过多创建和销毁对象带来的开销.
2,线程的作用
一般,在默认情况下,一个进程就只有一个线程,也就是主线程.让进行交互操作.为了用户操作的流畅性,就不能在主线程进行一些耗时操作,比如网络请求,I/O操作,这个时间一长,就容易造成ANR现象.
所以这个时候.就要开启子线程,进行耗时操作,最后通过Handler,AsyncTask,Rxjava等异步类将结果传递到主线程,进行UI更新.
3,线程的生命周期
新建:线程被创建,还没有调用start()
就绪(调用start()之后),
运行(执行run()之后),
阻塞(线程被暂停),
死亡(线程被停止))
(二)线程池
1,优点:
A,可以避免不断的创建和销毁线程带来的开销
B,能够有效的控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象.
C,能够提供定时执行和间隔循环执行等功能.
2,ThreadPoolExcutor的构造方法中的6个重要参数:
A,CorePoolSize,线程池的最大核心线程数量.默认情况下,会一直存活.除非设置allowCoreThreadTimeOut属性为true,那只要超过KeepAliveTime设定的闲置时长,也会被回收.
B,maximumPoolSize,线程池能够容纳的最大线程数,当活动线程达到这个数据,后续的新任务就不会执行
C,keppAliveTime,非核心线程的闲置时长.如果非核心线程的闲置时间超过这个时长,就会被回收.
但,allowCoreThreadTimeOut属性被设置为true,只要超过KeepAliveTime设定的闲置时长,核心线程也会被回收.
D,unit,keepAliveTime闲置时长的单位.这是一个枚举,常用的有TimeUnit.MILLISECOND(毫秒),TimeUnit.SECOND(秒),TimeUnit.MINUTES(分钟)等.
E,workQueue,线程池中的任务队列,通过线程池的execute()方法提交的Runnable对象会存储在这个参数中.
F,threadfactory,为线程池提供创建新线程的功能.它是一个接口,只有一个抽象方法, Thread newThread(Runnnable r);
3,ThreadPoolExecutor执行顺序:
A,当活动的核心线程数量未达到设定的核心线程数量时,就会直接启动一个核心线程来执行任务
B,当活动的核心线程数量达到设定的核心线程数量时,就会让任务到任务队列中排队.
C,在步骤B中,若任务队列排满了以后,就会立即启动一个非核心线程来执行任务.
D,如果线程数量达到线程池规定的最大值时,那就会拒绝执行此任务.ThreadPoolExecutor就会调用RejectedExecutorHandler的rejectedExecutor()方法来通知调用者.
E,当任务执行完,就会一个一个的回收非核心线程.核心线程不会自动回收,即使闲置,也会存在,除非自己将allowCoreThreadTimeOut属性设为true.
4,线程池的分类:
FixedThreadPool,CacheThreadPool,ScheduledThreadPool,SingleThreadPool,
A,FixedThreadPool,
线程数量固定,
只有核心线程,且不会被回收,能快速响应外界请求
当所有线程在活动时,新任务会处于等待状态
对列没有大小限制
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
fixedThreadPool.execute(myRun);
B,CacheThreadPool,
线程数量不定,
只有非核心线程,最大数量为Integer.MAX_VALUE
闲置时间超过60秒,就会被回收
适合执行大量的耗时少的任务
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.execute(myRun);
C,ScheduledThreadPool
核心线程数量固定,非核心线程数量不固定
非核心线程一旦闲置,就会被回收
主要用于执行定时任务,具有固定周期的重复任务
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
//1秒后执行Runnable
scheduledThreadPool.schedule(myRun,1000, TimeUnit.MILLISECONDS);
//延迟20毫秒后,每个2秒就执行一次Runnable
scheduledThreadPool.scheduleAtFixedRate(myRun,20,2000,TimeUnit.MILLISECONDS);
D,SingleThreadPool
只有一个核心线程
将外界任务统一到一个线程,这样任务之间就不需要处理线程同步的问题
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
singleThreadExecutor.execute(myRun);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。