技术原理

Android Thread Pool运用01

序言

实际上平时做项目满少立即应用到Thread Pool,绝大多数项目经营规模都并不大,难度系数都不高,沒有非常複杂的测算或用时的实际操作,最普遍的基本上全是刻UI,Call API。但无论是Call API、或者处理照片等用时的个人行为基本上也都是有模块极致做完了,但是一直不可以一辈子用他人搞好的模块,一直有必须独当一面的情况下。

这里大家就讨论一下通话API或是处理照片大部分都该会采用的最底层个人行为Thread。

文章正文

Android原生态能用的ThreadPool有几种,分别是FixedThreadPool、ScheduledThreadPool、CachedThreadPool、SingleThreadExecutor

基础详细介绍

FixedThreadPool
特点:算作一个基础款的Thread Pool,能够 限定另外实行的Thread总数
应用方法以下,newFixedThreadPool带到的主要参数便是可另外实行的总数,因此这里便是数最多另外实行2个Thread
假定一开始实行了四个,头2个会先跑,剩余的2个会等候前边的完毕后才逐一补上

ExecutorService mFixedThreadPool = Executors.newFixedThreadPool(2);
mFixedThreadPool.execute(new MyRunnable());

ScheduledThreadPool
特点:可做排程、週期性实行
newScheduledThreadPool一样是带到可另外实行的Thread总数,scheduleAtFixedRate/scheduleWithFixedDelay二者标准不一样,应用时要留意一下要求

ScheduledExecutorService mScheduledThreadPool = Executors.newScheduledThreadPool(2);

mScheduledThreadPool.execute(new MyRunnable());

or
//推迟500ms实行
mScheduledThreadPool.schedule(new MyRunnable(), 500, TimeUnit.MILLISECONDS);

or
//推迟一秒实行,每三秒实行一次
mScheduledThreadPool.scheduleAtFixedRate(new MyRunnable(), 1, 3, TimeUnit.SECONDS);

or
//推迟一秒实行,每一次实行完后等候三秒实行下一次
mScheduledThreadPool.scheduleWithFixedDelay(new MyRunnable(), 1, 3, TimeUnit.SECONDS);

CachedThreadPool
特点:沒有限定总数,Thread在沒有应用时候被收购,60秒内可被再次应用,假如也没有已收购的实行绪则建立新的

ExecutorService mCacheThreadPool = Executors.newCachedThreadPool();
mCacheThreadPool.execute(new MyRunnable());

SingleThreadExecutor
特点:仅用单一个Thread实行

ExecutorService mSingleThreadExecutor = Executors.newSingleThreadExecutor();
mSingleThreadExecutor.execute(new MyRunnable());

实操探讨

看了基础详细介绍后将会会感觉,仿佛除开ScheduledThreadPool之外,别的的看不出来什幺非常显著的差别
因此这里就来较为一下,除开ScheduledThreadPool之外别的三个Thread Pool具体跑起来的区别

最先大家建立一个客製化的Runnable,Log一下时下Thread的名字及其复位的次序标识
https://ithelp.ithome.com.tw/upload/images/20200521/20126774xDhmhOLY2x.png

在应用FixedThreadPool时,每一个Runnable隶属的Thread名字是不一样的
https://ithelp.ithome.com.tw/upload/images/20200521/20126774zHKA40cr3O.png

接下去是CachedThreadPool,pool-1-thread-1 ~ 3重複应用了2次,合乎上边大家常说的,因为每一个Runnable必须最少一秒才可以实行完,因此基本上另外实行order 01~03时建立了三组新的Thread(1~3),但等候2秒后实行order 04~06时,本来的pool-1-thread-1 ~ 3早已都实行完后,立刻用来重複运用
https://ithelp.ithome.com.tw/upload/images/20200521/20126772mfj4VvINXR.png

再说大家检测另一个情况的CachedThreadPool,这里有意等候超出60秒再实行order 04~06,就务必要再建立新的Thread
https://ithelp.ithome.com.tw/upload/images/20200521/20126774vDaTrObzRm.png

最终是SingleThreadExecutor,实行01~06统统在同一个Thread上,细心看一下Log時间,每一个间距基本上能够 说成一秒,能够 发觉这里将会会产生堵塞、等候的难题
https://ithelp.ithome.com.tw/upload/images/20200521/20126774FLr4Q4ZOq8.png

依据

实操完以后我本人针对Thread Pool运用机会上带大约抓到方位,出示我本人的建议让大伙儿参照

FixedThreadPool

  • "将会"用以不宜一次跑很多另外开展的个人行为,就用Fixed限定较大 总数,使系统软件自主分次解决

ScheduledThreadPool

  • 这大约无需多讲,很显著便是排程、週期性有关的个人行为很合适用

CachedThreadPool

  • 用于做测算类,比如下边这类手机游戏,必须算好每一个砲弹挪动坐标
    https://i.gbc.tw/gb_img/3387989l.png

SingleThreadExecutor

  • 因为实行上面务必要等候前一个进行,才可以延续实行,也许能够 运用这一特点,做一些与次序相关的实际操作

对于一开始提及的Call API,处理照片载入、缓存文件、二环节缓存文件等,应当会先应用CachedThreadPool试一试,第二候选人则是FixedThreadPool

之上实属我本人念头,有一切建议、纠正或是具体应用实例热烈欢迎共享探讨

你也可能喜欢

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
人工智能医疗前景 投稿者
我还没有学会写个人说明!
最近文章
  • * 没有更多文章了
  • 热门搜索

    分类目录