电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android的線程和線程池

瀏覽:6日期:2022-09-27 13:24:17

(1) 在Java中默認情況下一個進程只有一個線程,也就是主線程,其他線程都是子線程,也叫工作線程。Android中的主線程主要處理和界面相關的事情,而子線程則往往用于執(zhí)行耗時操作。線程的創(chuàng)建和銷毀的開銷較大,所以如果一個進程要頻繁地創(chuàng)建和銷毀線程的話,都會采用線程池的方式。

(2) 在Android中除了Thread,還有HandlerThread、AsyncTask以及IntentService等也都扮演著線程的角色,只是它們具有不同的特性和使用場景。AsyncTask封裝了線程池和Handler,它主要是為了方便開發(fā)者在子線程中更新UI。HandlerThread是一種具有消息循環(huán)的線程,在它的內部可以使用Handler。IntentService是一個服務,它內部采用HandlerThread來執(zhí)行任務,當任務執(zhí)行完畢后就會自動退出。因為它是服務的緣故,所以和后臺線程相比,它比較不容易被系統(tǒng)殺死。

(3). 從Android 3.0開始,系統(tǒng)要求網絡訪問必須在子線程中進行,否則網絡訪問將會失敗并拋出NetworkOnMainThreadException這個異常,這樣做是為了避免主線程由于被耗時操作所阻塞從而出現ANR現象。

Android中的線程形態(tài)AsyncTask

AsyncTask是一個抽象泛型類,它提供了Params、Progress、Result三個泛型參數,如果task確實不需要傳遞具體的參數,那么都可以設置為Void。下面是它的四個核心方法,其中doInBackground不是在主線程執(zhí)行的。

onPreExecute、doInBackground、onProgressUpdate、onPostResult

注意事項:

AsyncTask必須在主線程中加載必須在誅仙城中創(chuàng)建execute必須在UI線程調用一個AsyncTask對象只能執(zhí)行一次,即只能調用一次execute方法在Android1.6的時候線程池是并行任務,在Android3.0為了避免并發(fā)錯誤采用串行執(zhí)行任務。但是我們仍然可以用過executeOnExecutor方法并行執(zhí)行任務。HandlerThread

它繼承了Thread,是一種可以使用Handler的Thread.他的實現也很簡單,就是在run方法中通過Looper。prepare來創(chuàng)建消息隊列,并通過Looper.loop來開啟消息循環(huán),這樣在使用的時候就可以在HandlerThread中創(chuàng)建Handler了。

@Overridepublic void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) {mLooper = Looper.myLooper();notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1;}

HandlerThread在內部創(chuàng)建了消息隊列,外界需要通過Handler的消息方式開通知它執(zhí)行一個具體的任務,它的一個具體實現是IntentService。當我們不需要使用Handler的時候可以通過quit獲取quitSafelt方法終結線程的執(zhí)行。

IntentService

繼承了Service是一個抽象類,必須創(chuàng)建它的子類才可以使用它,IntentService可以執(zhí)行后臺耗時任務,當任務執(zhí)行完畢之后會自動停止,因為他是服務,所以他的優(yōu)先級比普通的線程高,比較適合執(zhí)行一些高優(yōu)先級的后臺任務。

Android中的線程池

Android里面,耗時的網絡操作,都會開子線程,在程序里面直接開過多的線程會消耗過多的資源,在眾多的開源框架中也總能看到線程池的蹤影,所以線程池是必須要會把握的一個知識點;

線程池的優(yōu)點:

重用線程池中的線程,避免頻繁創(chuàng)建和銷毀帶來的性能開銷可以有效控制線程池中的最大并發(fā)數,避免大量線程之間互相搶占系統(tǒng)資源導致阻塞可以對線程進行簡單管理。

線程運行機制

開啟線程過多,會消耗 cpu資源單核cpu,同一時刻只能處理一個線程,多核cpu同一時刻可以處理多個線程操作系統(tǒng)為每個運行線程安排一定的CPU時間—- 時間片 ,系統(tǒng)通過一種循環(huán)的方式為線程提供時間片,線程在自己的時間內運行,因為時間相當短,多個線程頻繁地發(fā)生切換,因此給用戶的感覺就是好像多個線程同時運行一樣,但是如果計算機有多個CPU,線程就能真正意義上的同時運行了.

線程池的作用

線程池是預先創(chuàng)建線程的一種技術。線程池在還沒有任務到來之前,創(chuàng)建一定數量的線程,放入空閑隊列中,然后對這些資源進行復用。 減少頻繁的創(chuàng)建和銷毀對象。頻繁創(chuàng)建和銷毀線程耗資源,耗時間因為有的線程執(zhí)行時間比創(chuàng)建和銷毀一個線程的時間還短

線程池涉及的類

Executor:Java里面線程池的頂級接口。ExecutorService:真正的線程池接口。ScheduledExecutorService:能和Timer/TimerTask類似,解決那些需要任務重復執(zhí)行的問題。ThreadPoolExecutor(重點):ExecutorService的默認實現。ScheduledThreadPoolExecutor:繼承ThreadPoolExecutor的ScheduledExecutorService接口實現,周期性任務調度的類實現。Executors:可以一行代碼創(chuàng)建一些常見的線程池。Executors介紹(把握使用,把握常見線程池)

Executors:jdk1.5之后的一個新類, 提供了一些靜態(tài)方法,幫助我們方便的生成一些常用的線程池 ,ThreadPoolExecutor是Executors類的底層實現

1.newSingleThreadExecutor

創(chuàng)建一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當于單線程串行執(zhí)行>所有任務。如果這個唯一的線程因為異常結束,那么會有一個新的線程來替代它。此線程池>保證所有任務的執(zhí)行順序按照任務的提交順序執(zhí)行。

2.newFixedThreadPool

創(chuàng)建固定大小的線程池。每次提交一個任務就創(chuàng)建一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執(zhí)行異常而結束,那么線程池會補充一個新線程。

3.newCachedThreadPool

創(chuàng)建一個可緩存的線程池。如果線程池的大小超過了處理任務所需要的線程,

那么就會回收部分空閑(60秒不執(zhí)行任務)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴于操作系統(tǒng)(或者說JVM)能夠創(chuàng)建的最大線程大小。

4.newScheduledThreadPool

創(chuàng)建一個大小無限的線程池。此線程池支持定時以及周期性執(zhí)行任務的需求。

ThreadPoolExecutor介紹

//構造方法public ThreadPoolExecutor(int corePoolSize,//核心池的大小 int maximumPoolSize,//線程池最大線程數 long keepAliveTime,//保持時間 TimeUnit unit,//時間單位 BlockingQueue<Runnable> workQueue,//任務隊列 ThreadFactory threadFactory,//線程工廠 RejectedExecutionHandler handler) //異常的捕捉器

構造相關參數解釋

corePoolSize: 核心池的大小 ,這個參數跟后面講述的線程池的實現原理有非常大的關系。在創(chuàng)建了線程池后,默認情況下,線程池中并沒有任何線程,而是等待有任務到來才創(chuàng)建線程去執(zhí)行任務,除非調用了prestartAllCoreThreads()或者prestartCoreThread()方法,從這2個方法的名字就可以看出,是預創(chuàng)建線程的意思,即在沒有任務到來之前就創(chuàng)建corePoolSize個線程或者一個線程。默認情況下,在創(chuàng)建了線程池后,線程池中的線程數為0,當有任務來之后,就會創(chuàng)建一個線程去執(zhí)行任務,當線程池中的線程數目達到corePoolSize后,就會把到達的任務放到緩存隊列當中;maximumPoolSize: ’線程池最大線程數 ,這個參數也是一個非常重要的參數,它表示在線程池中最多能創(chuàng)建多少個線程;keepAliveTime: 表示線程沒有任務執(zhí)行時最多保持多久時間會終止 。默認情況下,只有當線程池中的線程數大于corePoolSize時,keepAliveTime才會起作用,直到線程池中的線程數不大于corePoolSize,即當線程池中的線程數大于corePoolSize時,如果一個線程空閑的時間達到keepAliveTime,則會終止,直到線程池中的線程數不超過corePoolSize。但是如果調用了allowCoreThreadTimeOut(boolean)方法,在線程池中的線程數不大于corePoolSize時,keepAliveTime參數也會起作用,直到線程池中的線程數為0;

unit:參數keepAliveTime的 時間單位 ,有7種取值

TimeUnit.DAYS; //天TimeUnit.HOURS; //小時TimeUnit.MINUTES; //分鐘TimeUnit.SECONDS; //秒TimeUnit.MILLISECONDS; //毫秒TimeUnit.MICROSECONDS; //微妙TimeUnit.NANOSECONDS; //納秒

workQueue : 任務隊列 ,是一個阻塞隊列,用來存儲等待執(zhí)行的任務,這個參數的選擇也很重要,會對線程池的運行過程產生重大影響,參考BlockingQueue

ArrayBlockingQueueLinkedBlockingQueueSynchronousQueue

threadFactory : 線程工廠 ,如何去創(chuàng)建線程的

handler : 任務隊列添加 異常的捕捉器 ,參考 RejectedExecutionHandler

ThreadPoolExecutor.AbortPolicy:丟棄任務并拋出RejectedExecutionException異常。 ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不拋出異常。 ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務,然后重新嘗試執(zhí)行任務(重復此過程)ThreadPoolExecutor.CallerRunsPolicy:由調用線程處理該任務

基礎API的介紹

isShutdown() : 判斷線程池是否關閉isTerminated() : 判斷線程池中任務是否執(zhí)行完成shutdown() : 調用后不再接收新任務,如果里面有任務,就執(zhí)行完shutdownNow() : 調用后不再接受新任務,如果有等待任務,移出隊列;有正在執(zhí)行的,嘗試停止之submit() : 提交執(zhí)行任務execute() : 執(zhí)行任務

任務提交給線程池之后的處理策略

如果當前線程池中的線程數目小于corePoolSize,則每來一個任務,就會創(chuàng)建執(zhí)行這個任務;如果當前線程池中的線程數目>=corePoolSize,則每來一個任務,會嘗試將其添加到任務緩存隊列當中若添加成功,則該任務會等待空閑線程將其取出去執(zhí)行;若添加失敗(一般來說是任務緩存隊列已滿,針對的是有界隊列),則會嘗試創(chuàng)建新的線程去執(zhí)行這個任務;如果當前線程池中的線程數目達到maximumPoolSize,則會采取任務拒絕策略進行處理;如果線程池中的線程數量大于 corePoolSize時,如果某線程空閑時間超過keepAliveTime,線程將被終止,直至線程池中的線程數目不大于corePoolSize;如果允許為核心池中的線程設置存活時間,那么核心池中的線程空閑時間超過keepAliveTime,線程也會被終止。

任務提交給線程池之后的處理策略_比喻

假如有一個工廠,工廠里面有10( corePoolSize )個工人,每個工人同時只能做一件任務。

因此只要當10個工人中有工人是空閑的, 來了任務就分配 給空閑的工人做;

當10個工人都有任務在做時,如果還來了任務,就把任務進行排隊等待( 任務隊列 );

如果說新任務數目增長的速度遠遠大于工人做任務的速度,那么此時工廠主管可能會想補救措施,比如重新招4個臨時工人( 創(chuàng)建新線程 )進來;然后就將任務也分配給這4個臨時工人做;

如果說著14個工人做任務的速度還是不夠,此時工廠主管可能就要考慮不再接收新的任務或者拋棄前面的一些任務了( 拒絕執(zhí)行 )。

當這14個工人當中有人空閑時,而且空閑超過一定時間( 空閑時間 ),新任務增長的速度又比較緩慢,工廠主管可能就考慮辭掉4個臨時工了,只保持原來的10個工人,畢竟請額外的工人是要花錢的

阻塞隊列的介紹(BlockingQueue)

阻塞隊列,如果BlockingQueue是空的,從BlockingQueue取東西的操作將會被阻斷進入等待狀態(tài),直到BlockingQueue進了東西才會被喚醒,同樣,如果BlockingQueue是滿的,任何試圖往里存東西的操作也會被阻斷進入等待狀態(tài),直到BlockingQueue里有空間時才會被喚醒繼續(xù)操作。

基礎API介紹

往隊列中加元素的方法

add(E) : 非阻塞方法, 把元素加到BlockingQueue里,如果BlockingQueue可以容納,則返回true,否則拋出異常。offer(E) : 非阻塞, 表示如果可能的話,將元素加到BlockingQueue里,即如果BlockingQueue可以容納,則返回true,否則返回false。put(E):阻塞方法, 把元素加到BlockingQueue里,如果BlockingQueue沒有空間,則調用此方法的線程被阻斷直到BlockingQueue里有空間再繼續(xù)。

從隊列中取元素的方法

poll(time): 阻塞方法,取走BlockingQueue里排在首位的元素,若不能立即取出,則可以等time參數規(guī)定的時間,取不到時返回null。take():取走BlockingQueue里排在首位的對象,若BlockingQueue為空,阻斷進入等待狀態(tài)直到BlockingQueue有新的對象被加入為止。

子類介紹

ArrayBlockingQueue(有界隊列) : FIFO 隊列,規(guī)定大小的BlockingQueue,其構造函數必須帶一個int參數來指明其大小

LinkedBlockingQueue(無界隊列) :FIFO 隊列,大小不定的BlockingQueue,若其構造函數帶一個規(guī)定大小的參數,生成的BlockingQueue有大小限制,若不帶大小參數,所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定。

PriorityBlockingQueue :優(yōu)先級隊列, 類似于LinkedBlockingQueue,但隊列中元素非 FIFO, 依據對象的自然排序順序或者是構造函數所帶的Comparator決定的順序

SynchronousQueue(直接提交策略) : 交替隊列, 隊列中操作時必須是先放進去,接著取出來 ,交替著去處理元素的添加和移除,這是一個很有意思的阻塞隊列,其中每個插入操作必須等待另一個線程的移除操作,同樣任何一個移除操作都等待另一個線程的插入操作。因此此隊列內部其 實沒有任何一個元素,或者說容量是0,嚴格說并不是一種容器。由于隊列沒有容量,因此不能調用peek操作,因為只有移除元素時才有元素。

來自:https://imuhao.github.io/2016/08/19/Thread-Executors/

標簽: Android
相關文章:
主站蜘蛛池模板: 提升海外网站流量,增加国外网站访客UV,定制海外IP-访客王 | 空压机网_《压缩机》杂志| 上海噪音治理公司-专业隔音降噪公司-中广通环保| 齿轮减速马达一体式_蜗轮蜗杆减速机配电机-德国BOSERL齿轮减速电动机生产厂家 | sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 耙式干燥机_真空耙式干燥机厂家-无锡鹏茂化工装备有限公司 | 全国国际化学校_国际高中招生_一站式升学择校服务-国际学校网 | 智能风向风速仪,风速告警仪,数字温湿仪,综合气象仪(气象五要素)-上海风云气象仪器有限公司 | 不锈钢螺丝,不锈钢螺栓,不锈钢标准件-江苏百德特种合金有限公司 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 不发火防静电金属骨料_无机磨石_水泥自流平_修补砂浆厂家「圣威特」 | 健康管理师报名入口,2025年健康管理师考试时间信息网-网站首页 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 翰墨AI智能写作助手官网_人工智能问答在线AI写作免费一键生成 | 泵阀展|阀门展|水泵展|流体机械展 -2025上海国际泵管阀展览会flowtech china | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 优秀的临床医学知识库,临床知识库,医疗知识库,满足电子病历四级要求,免费试用 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 乐之康护 - 专业护工服务平台,提供医院陪护-居家照护-居家康复 | 磁力抛光机_磁力研磨机_磁力去毛刺机-冠古设备厂家|维修|租赁【官网】 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 风电变桨伺服驱动器-风电偏航变桨系统-深圳众城卓越科技有限公司 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 苗木价格-苗木批发-沭阳苗木基地-沭阳花木-长之鸿园林苗木场 | 澳洁干洗店加盟-洗衣店干洗连锁「澳洁干洗免费一对一贴心服务」 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 杰福伦_磁致伸缩位移传感器_线性位移传感器-意大利GEFRAN杰福伦-河南赉威液压科技有限公司 | 移动机器人产业联盟官网| 科客,主见不成见| 快速门厂家-快速卷帘门-工业快速门-硬质快速门-西朗门业 | 体视显微镜_荧光生物显微镜_显微镜报价-微仪光电生命科学显微镜有限公司 | 选宝石船-陆地水上开采「精选」色选机械设备-青州冠诚重工机械有限公司 | 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | 岩棉板|岩棉复合板|聚氨酯夹芯板|岩棉夹芯板|彩钢夹芯板-江苏恒海钢结构 | 复合肥,化肥厂,复合肥批发,化肥代理,复合肥品牌-红四方 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 信阳网站建设专家-信阳时代网联-【信阳网站建设百度推广优质服务提供商】信阳网站建设|信阳网络公司|信阳网络营销推广 | 电动手术床,医用护理床,led手术无影灯-曲阜明辉医疗设备有限公司 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 鑫铭东办公家具一站式定制采购-深圳办公家具厂家直销 | 转向助力泵/水泵/发电机皮带轮生产厂家-锦州华一精工有限公司 |