Android之线程池深度剖析
1.线程池的引入
引入的好处:
1)提升性能。创建和消耗对象费时费CPU资源
2)防止内存过度消耗。控制活动线程的数量,防止并发线程过多。
使用条件:
假设在一台服务器完成一项任务的时间为T
T1 创建线程的时间
T2 在线程中执行任务的时间,包括线程间同步所需时间
T3 线程销毁的时间
显然T = T1+T2+T3。注意这是一个极度简化的假设。
可以看出T1,T3是多线程本身的带来的开销,我们渴望减少T1,T3所用的时间,从而减少T的时间。但一些线程的使用者并没有注意到这一点,所以在程序中频繁的创建或销毁线程,这导致T1和T3在T中占有相当比例。显然这是突出了线程的弱点(T1,T3),而不是优点(并发性)。
线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。
线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目。
在Android中当同时并发多个网络线程时,引入线程池技术会极大地提高APP的性能。
2.线程池例子
1)JDK自身带有线程池的实现类ThreadPoolExecutor
2)下面是一个模拟ThreadPoolExecutor的例子,以加深对原理的理解
public final class ThreadPool {// 线程池中默认线程的个数为5private static int worker_num = 5;// 工作线程private WorkThread[] workThreads;// 任务队列,作为一个缓冲,List线程不安全private List<Runnable> taskQueue = new LinkedList<Runnable>();private static ThreadPool threadPool;// 创建具有默认线程个数的线程池private ThreadPool() {this(5);}// 创建线程池,worker_num为线程池中工作线程的个数private ThreadPool(int worker_num) {ThreadPool.worker_num = worker_num;workThreads = new WorkThread[worker_num];for (int i = 0; i < worker_num; i++) {workThreads[i] = new WorkThread();workThreads[i].start();// 开启线程池中的线程 }}// 单态模式,获得一个默认线程个数的线程池public static ThreadPool getThreadPool() {return getThreadPool(ThreadPool.worker_num);}// 单态模式,获得一个指定线程个数的线程池,worker_num(>0)为线程池中工作线程的个数// worker_num<=0创建默认的工作线程个数public static ThreadPool getThreadPool(int worker_num1) {if (threadPool == null)threadPool = new ThreadPool(worker_num1);return threadPool;}// 执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定public void addTask(Runnable task) {synchronized (taskQueue) {taskQueue.add(task);taskQueue. notifyAll();}}// 销毁线程池,该方法保证在所有任务都完成的情况下才销毁所有线程,否则等待任务完成才销毁public void destroy() {while (!taskQueue.isEmpty()) {// 如果还有任务没执行完成,就先睡会吧try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}// 工作线程停止工作,且置为nullfor (int i = 0; i < worker_num; i++) {workThreads[i].stopWorker();workThreads[i] = null;}threadPool=null;taskQueue.clear();// 清空任务队列 }/*** 内部类,工作线程*/private class WorkThread extends Thread {// 该工作线程是否有效,用于结束该工作线程private boolean isRunning = true;/** 关键所在啊,如果任务队列不空,则取出任务执行,若任务队列空,则等待*/@Overridepublic void run() {Runnable r = null;while (isRunning) {// 注意,若线程无效则自然结束run方法,该线程就没用了 synchronized (taskQueue) {while (isRunning && taskQueue.isEmpty()) {// 队列为空try {taskQueue.wait(20);} catch (InterruptedException e) {e.printStackTrace();}}if (!taskQueue.isEmpty())r = taskQueue.remove(0);// 取出任务 }if (r != null) {r.run();// 执行任务 }r = null;}}// 停止工作,让该线程自然执行完run方法,自然结束public void stopWorker() {isRunning = false;}} }
转载于:https://www.cnblogs.com/zhujiabin/p/6021790.html
Android之线程池深度剖析相关推荐
- 【转】Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask
方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { ...
- android 异步线程的使用
//从项目中取出的,android 异步线程的使用,去执行上传百度云图片, public class MyThreadsAddMember extends AsyncTask<Integer, ...
- android异步线程利用Handler将消息发送至UI线程
android UI线程安全 首先对于android而言,UI线程就是我们的主线程,在Android应用启动时,会自动创建一个线程,主线程负责UI的展示.UI事件消息的派发处理等等,因此主线程也叫做U ...
- Android UI线程和非UI线程
UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的 ...
- android 打印线程信息
今天,讲讲如何打印线程的id. 用语句: Android.os.Process //获取当前进程的方法 android.os.Process.getElapsedCpuTime():获 ...
- Android子线程真的不能更新UI么
Android单线程模型是这样描述的: Android UI操作并不是线程安全的,并且这些操作必须在UI线程执行 如果在其它线程访问UI线程,Android提供了以下的方式: Activity.run ...
- android异步线程未执行,关于多线程:当服务在后台运行时,Android异步任务无法正常运行(doInBackground未执行)...
我注意到有时Async任务无法正常运行,实际上它的doInBackground()方法没有被调用,这种情况主要发生在该活动在后台运行任何服务时. 例如,当音乐在带有服务的后台运行时,Async任务不会 ...
- Android子线程更新UI的方法总结
消息机制,对于Android开发者来说,应该是非常熟悉.对于处理有着大量交互的场景,采用消息机制,是再好不过了.有些特殊的场景,比如我们都知道,在Android开发中,子线程不能更新UI,而主线程又不 ...
- Android之线程池
http://www.trinea.cn/android/java-android-thread-pool/ 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是 ...
最新文章
- btc勒索病毒文件恢复及数据库恢复方案
- 3.7 感知器-机器学习笔记-斯坦福吴恩达教授
- 一个简单的pygame接金币游戏
- Java单例模式(Singleton)的五种实现
- jmeter(一)安装教程
- 解决.NET Core中MailKit无法使用阿里云邮件推送服务的问题
- silklabo哪个公众号有资源_微小说免费渣渣团资源公众号看大全集
- PHP编写命令行脚本和后台运行程序的注意事项
- 树莓派Java程序运行_树莓派上Java程序作为linux服务并开机自动启动
- python实现登陆注册跳转_Python模拟登录和登录跳转的参考示例
- Chrome的两个工具
- java套接字通信_Java网络通信套接字 | 学步园
- 戴尔服务器H330阵列卡取消磁盘阵列教程
- 2015阿里天池大数据竞赛-Solution
- IT痴汉的工作现状23-乡关何处
- win7如何设置wifi热点_mac如何共享网络?mac怎么建立wifi热点?
- Docker常用命令(基础)
- Git命令及集成IDEA、Gitee/GitHub/GitLab
- 是德科技34461a万用表
- 【转】基于OAI-PMH的元数据搜索引擎的设计与实现
热门文章
- python四大软件-太牛逼!一款软件几乎可以操作所有的数据库!
- python的下载和安装步骤-PyCharm下载和安装详细步骤
- python画折线图代码-Python绘制折线图和散点图的详细方法介绍(代码示例)
- python自学流程-Python系统学习流程图,教你一步步学习python
- 编程软件python下载-python 2.7官方版
- r语言和python-R语言和Python哪个适合生物信息学?
- 用python的turtle画圆-Python turtle 绘图画圆
- python爬虫简单实例-最简单爬虫示例(入门级)
- 疯狂python讲义视频 百度云-疯狂的python讲义 PDF 下载
- python的源代码文件的扩展名是-python源文件后缀是什么?