您好,登錄后才能下訂單哦!
Android 的線程和線程池
從用途上分,線程分為主線程和子線程;主線程主要處理和界面相關的事情,子線程則往往用于耗時操作。
主線程和子線程
主線程是指進程所擁有的線程。Android 中主線程交 UI 線程,主要作用是運行四大組件以及處理它們和用戶的交互;子線程的作業則是執行耗時任務。
Android 中的線程形態
1、AsyncTask AsyncTask 是一種輕量級的異步任務類,可以在線程池中執行后臺任務,然后把執行的進度和最終結果傳遞給主線程并在主線程中更新 UI, AsyncTask 是一個抽象的泛型類,提供了 Params(參數的類型)、Progress(后臺任務執行進度的類型) 和 Result(后臺任務的返回結果的類型) 這三個泛型參數, AsyncTask 提供了4個核心方法
onPreExcute 先執行,接著是 doInBackground,最后才是 onPostExecute。 當異步任務被取消時,onCancelled() 方法會被調用,這個時候 onPostExecute 則不會被調用。
2、AsyncTask 在具體的使用過程中的一些限制條件
3、AsyncTask 的工作原理 AsyncTask 中有兩個線程池(SerialExecutor 和 THREAD_POOL_EXECUTOR) 和一個 Handler(InternalHandler),線程池 SerialExecutor 用于任務的排隊,線程池 THREAD_POOL_EXECUTOR 用于真正地執行任務,InternalHandler 用于將執行環境從線程池切換到主線程。
4、HandlerThread HandlerThread 繼承了 Thread,是一種可以使用 Handler 的 Thread, 它的實現就是在 run 方法中通過 Looper.prepare() 來創建消息隊列,并通過 Looper.loop() 來開啟消息循環。
與普通的 Thread 相比,普通 Thread 主要用于在 run 方法中執行一個耗時任務,而 HandlerThread 在內部創建了消息隊列,外界需要通過 Handler 的消息方式來通知 HandlerThread 執行一個具體的任務。
由于 HandlerThread 的 run 方法是一個無限循環,因此當明確不需要在使用 HandlerThread 時,可以通過它的 quit 或者 quitSafely 方法來終止線程的執行。
5、IntentService IntentService 是一種特殊的 Service,繼承了 Service 并且是一個抽象類,必須創建它的子類才能使用 IntentService。IntentService可用于執行后臺耗時任務,任務執行后會自動停止,并且它的優先級比單純的線程要高很多,不容易被系統殺死。在實現上,IntentService 封裝了 HandlerThread 和 Handler。
Android 中的線程池
線程池的優點
ThreadPoolExecutor ThreadPoolExecutor 是線程的真正實現。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
ThreadPoolExecutor 執行任務時遵循的規則
線程池的分類
系統預置4種線程池的典型使用方法:
Runnable command = new Runnable(){ @Override public void run(){ SystemClock.sleep(2000); } ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4); fixedThreadPool.execute(command); ExecutorService cachedThreadPool =Executors.newCachedThreadPool(); cachedThreadPool.execute(command); ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4); // 2000ms 后執行 command scheduledThreadPool.schedule(command,2000,TimeUnit.MILLISECONDS); // 延遲10ms,每個1000ms執行一次 command scheduledThreadPool.scheduleAtFixedRate(command,10,1000,TimeUnit.MILLISECONDS); ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); singleThreadExecutor.execute(command); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。