背景
大家都知道在我們的開發(fā)中永遠(yuǎn)都離不開多線程批销,對于我們?yōu)槭裁匆褂枚嗑€程嘿辟,多線程的使用和多線程的一些基礎(chǔ)知識這里我們就不講了土榴,有興趣的朋友可以去看一下博主之前的幾篇文章:
線程你真的了解它嗎
這才是真正的多線程
Android線程池的使用
那么為什么還要寫這一篇文章呢厦画,因?yàn)椴┲髟陂_發(fā)的過程中也經(jīng)常遇不同項(xiàng)目嘱能,然后每次都要來回復(fù)制代碼撬呢,配置不同參數(shù)覺得很麻煩伦吠,這里就進(jìn)行了一個封裝,最后直接打包發(fā)布魂拦,下次使用直接用gradle導(dǎo)入就OK了毛仪。這個框架也是從工作中的代碼抽取出來的,有好多人的代碼和邏輯貢獻(xiàn)芯勘。
代碼和使用方法最后都開源到了Github有興趣的朋友可以查看:GeekThread
具體功能
盡然是封裝了一個通用性的線程池框架箱靴,那么就一定要有它的通用性,安全性荷愕,全面性衡怀,所以大致的設(shè)計(jì)如下:
1、按照線程類型來區(qū)分線程池安疗,避免線程之間相互影響和占用(后面發(fā)現(xiàn)這種形式雖然可以互不干擾抛杨,但是多個線程池占用了更多資源和內(nèi)存,而且有一定的資源浪費(fèi)荐类,所以不可取)怖现。
2、按照線程優(yōu)先級來對同一線程池中的線程進(jìn)行執(zhí)行優(yōu)先級的區(qū)分玉罐。
3屈嗤、線程池創(chuàng)建增加同步鎖,避免同時(shí)出現(xiàn)多個吊输。
4饶号、保存每一個正在執(zhí)行的線程,方便使用者取消和移除對應(yīng)的工作線程璧亚。
5讨韭、通過計(jì)算cup等設(shè)備信息來配置最大線程池?cái)?shù)脂信,最大線程數(shù)等信息癣蟋。
6透硝、封裝入口方法,保護(hù)源碼的安全性和完整性疯搅。
7濒生、利用工廠等設(shè)計(jì)模式來提升代碼的可讀性和清晰性。
主要實(shí)現(xiàn)代碼
ThreadPriority p = null;
if (r instanceof GeekPriorityComparable) {
p = ((GeekPriorityComparable) r).getGeekPriority();
}
if (null != p) {
switch (p) {
case REAL:
Process.setThreadPriority(Process.myTid(), 0);
break;
case HIGH:
Process.setThreadPriority(Process.myTid(), 5);
break;
case NORMAL:
Process.setThreadPriority(Process.myTid(), 10);
break;
case LOW:
Process.setThreadPriority(Process.myTid(), 15);
break;
case BACKG:
Process.setThreadPriority(Process.myTid(), 20);
break;
default:
Process.setThreadPriority(Process.myTid(), 10);
break;
}
}
上面代碼是通過設(shè)置的線程等級來設(shè)置優(yōu)先級幔欧。
public class GeekThreadPools {
public static int executeWithGeekThreadPool(Runnable runnable){
return executeWithGeekThreadPool(runnable,ThreadType.NORMAL_THREAD,ThreadPriority.NORMAL);
}
/**
* 使用線程池執(zhí)行Runnable
* @param runnable 需要執(zhí)行的Runnable
* @param threadType Runnable 的任務(wù)類型 任務(wù)類型參考 {@link ThreadType}
* @param threadPriority Runnable 的優(yōu)先級 優(yōu)先級參考 {@link ThreadPriority}
* @return 當(dāng)前Runnable的key,key可以用來取消當(dāng)前還未執(zhí)行的任務(wù)
*/
public static int executeWithGeekThreadPool(final Runnable runnable, ThreadType threadType, ThreadPriority threadPriority){
if(null == runnable ){
return -1;
}
if(null == threadType){
threadType = ThreadType.NORMAL_THREAD;
}
if(null == threadPriority){
threadPriority = ThreadPriority.NORMAL;
}
GeekTask<Void> t = new GeekTask<>(runnable, null, threadPriority);
return GeekThreadManager.getInstance().submitCancelable(t,threadType);
}
}
上面是其中一個線程池的管理類罪治,大家可以通過它暴露的方法來執(zhí)行多線程操作。
使用方法
compile 'com.geek.thread:thread-pool:1.0.1'
詳細(xì)的可以參考GitHub項(xiàng)目說明GeekThread
總結(jié)
好了以上就是這次要給大家分享的Android線程池框架礁蔗,大家有什么問題可以給我發(fā)簡書或者加入樓主的技術(shù)QQ群:557381815觉义,我會在第一時(shí)間給大家解答,喜歡的朋友歡迎點(diǎn)贊或打賞浴井,給樓主動力晒骇,謝謝大家。