浅谈安卓线程池相关问题
2016-03-14 23:09
211 查看
作为一个标准的程序员,我们都非常清楚。线程的创建和销毁时一个耗时的操作,如果在程序中反复创建和销毁,那么APP的流畅度会很受影响,甚至会奔溃。为了增加程序健壮性且能是实现复杂业务逻辑,这时候我们引入线程池的概念。
线程池的优点在于减少了创建线程的消耗,每一次使用线程直接从线程池中拿来用即可,缺点就是线程池会一直占用内存,如果当我们只是用一个线程时,多余的创建出来的会造成资源浪费,也就是惊群现象。
A:线程的实现方法
POOL_SIZE = 4;// 线程池的大小最好设置成为CUP核数的2N
MAX_POOL_SIZE = 6;// 设置线程池的最大线程数
KEEP_ALIVE_TIME = 4;// 设置线程的存活时间
// 创建线程池工厂
ThreadFactory factory = new PriorityThreadFactory("threadpool", android.os.Process.THREAD_PRIORITY_BACKGROUND);
// 创建工作队列
BlockingQueue<Runnable> workQueue = new LinkedBlockingDeque<Runnable>();
mExecutor = nThreadPoolExecutor(POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, workQueue, factory);
}
// 在线程池中执行线程 id
submit(Runnable command){
Executor.execute(command)};
//在线程池的停止和关闭
ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutdown()和shutdownNow(),其中:
shutdown():不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务
shutdownNow():立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务
B:execute()执行
addIfUnderCorePoolSize():在线程池大小小于核心线程池大小的情况下,扩展线程池
addIfUnderMaximumPoolSize():在线程池大小小于线程池大小上限的情况下,扩展线程池
ensureQueuedTaskHandled():保证在线程池关闭的情况下,新加入队列的线程也能正确处理
C:核心线程问题
核心线程会一直存活,即使没有任务需要处理。当线程数小于核心线程数时,即使现有的线程空闲,线程池也会优先创建新线程来处理任务,而不是直接交给现有的线程处理。核心线程在allowCoreThreadTimeout被设置为true时会超时退出,默认情况下不会退出
线程池的优点在于减少了创建线程的消耗,每一次使用线程直接从线程池中拿来用即可,缺点就是线程池会一直占用内存,如果当我们只是用一个线程时,多余的创建出来的会造成资源浪费,也就是惊群现象。
A:线程的实现方法
POOL_SIZE = 4;// 线程池的大小最好设置成为CUP核数的2N
MAX_POOL_SIZE = 6;// 设置线程池的最大线程数
KEEP_ALIVE_TIME = 4;// 设置线程的存活时间
// 创建线程池工厂
ThreadFactory factory = new PriorityThreadFactory("threadpool", android.os.Process.THREAD_PRIORITY_BACKGROUND);
// 创建工作队列
BlockingQueue<Runnable> workQueue = new LinkedBlockingDeque<Runnable>();
mExecutor = nThreadPoolExecutor(POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, workQueue, factory);
}
// 在线程池中执行线程 id
submit(Runnable command){
Executor.execute(command)};
//在线程池的停止和关闭
ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutdown()和shutdownNow(),其中:
shutdown():不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务
shutdownNow():立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务
B:execute()执行
addIfUnderCorePoolSize():在线程池大小小于核心线程池大小的情况下,扩展线程池
addIfUnderMaximumPoolSize():在线程池大小小于线程池大小上限的情况下,扩展线程池
ensureQueuedTaskHandled():保证在线程池关闭的情况下,新加入队列的线程也能正确处理
C:核心线程问题
核心线程会一直存活,即使没有任务需要处理。当线程数小于核心线程数时,即使现有的线程空闲,线程池也会优先创建新线程来处理任务,而不是直接交给现有的线程处理。核心线程在allowCoreThreadTimeout被设置为true时会超时退出,默认情况下不会退出
相关文章推荐
- shell与aw的简单交互示例
- PowerShell复制目录以及目录下文件
- android studio 快捷键更改为和eclipse一样
- pdf虚拟打印机
- Android Fragment 真正的完全解析(下)
- 关于“代码规范”,“Review”和“Check list”(续)
- POJ 2823 Sliding Window
- Linux笔记(39)——权限的说明与命令
- Android Fragment 真正的完全解析(上)
- ViewPager和Fragment的组合使用
- win10 Hyper-v 网络配置
- 第三百四十七天 how can I 坚持
- awk一些简单命令
- Greendao 使用总结
- linux服务器历险之sysctl优化linux网络
- Android学习笔记:TabHost 和 FragmentTabHost
- 欢迎使用CSDN-markdown编辑器
- 最小化到托盘,右键退出
- 递归
- WaterDrop