背景
大家都知道在我們的開發中永遠都離不開多線程,對於我們為什么要使用多線程,多線程的使用和多線程的一些基礎知識這里我們就不講了,有興趣的朋友可以去看一下博主之前的幾篇文章:
線程你真的了解它嗎
這才是真正的多線程
Android線程池的使用
那么為什么還要寫這一篇文章呢,因為博主在開發的過程中也經常遇不同項目,然后每次都要來回復制代碼,配置不同參數覺得很麻煩,這里就進行了一個封裝,最后直接打包發布,下次使用直接用gradle導入就OK了。這個框架也是從工作中的代碼抽取出來的,有好多人的代碼和邏輯貢獻。
代碼和使用方法最后都開源到了Github有興趣的朋友可以查看:GeekThread
具體功能
盡然是封裝了一個通用性的線程池框架,那么就一定要有它的通用性,安全性,全面性,所以大致的設計如下:
1、按照線程類型來區分線程池,避免線程之間相互影響和占用(后面發現這種形式雖然可以互不干擾,但是多個線程池占用了更多資源和內存,而且有一定的資源浪費,所以不可取)。
2、按照線程優先級來對同一線程池中的線程進行執行優先級的區分。
3、線程池創建增加同步鎖,避免同時出現多個。
4、保存每一個正在執行的線程,方便使用者取消和移除對應的工作線程。
5、通過計算cup等設備信息來配置最大線程池數,最大線程數等信息。
6、封裝入口方法,保護源碼的安全性和完整性。
7、利用工廠等設計模式來提升代碼的可讀性和清晰性。
主要實現代碼
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; } }
上面代碼是通過設置的線程等級來設置優先級。
public class GeekThreadPools { public static int executeWithGeekThreadPool(Runnable runnable){ return executeWithGeekThreadPool(runnable,ThreadType.NORMAL_THREAD,ThreadPriority.NORMAL); } /** * 使用線程池執行Runnable * @param runnable 需要執行的Runnable * @param threadType Runnable 的任務類型 任務類型參考 {@link ThreadType} * @param threadPriority Runnable 的優先級 優先級參考 {@link ThreadPriority} * @return 當前Runnable的key,key可以用來取消當前還未執行的任務 */ 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); } }
上面是其中一個線程池的管理類,大家可以通過它暴露的方法來執行多線程操作。
使用方法
compile 'com.geek.thread:thread-pool:1.0.1'
詳細的可以參考GitHub項目說明GeekThread
總結
好了以上就是這次要給大家分享的Android線程池框架,大家有什么問題可以給我發簡書或者加入樓主的技術QQ群:557381815,我會在第一時間給大家解答,喜歡的朋友歡迎點贊或打賞,給樓主動力,謝謝大家。
作者:Only凹凸曼
鏈接:https://www.jianshu.com/p/a880393c3b53
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。