Android多線程基礎知識

1、進程

進程是系統調度和資源分配的一個獨立單位。android

在Android中,一個應用程序就是一個獨立的集成,應用運行在一個獨立的環境中,能夠避免其餘應用程序/進程的干擾。當咱們啓動一個應用程序時,系統就會建立一個進程(該進程是從Zygote中fork出來的,有獨立的ID),接着爲這個進程建立一個主線程,而後就能夠運行MainActivity了,應用程序的組件默認都是運行在其進程中。開發者能夠經過設置應用的組件的運行進程,在清單文件中給組件設置:android:process = "進程名";能夠達到讓組件運行在不一樣進程中的目的。讓組件運行在不一樣的進程中,既有好處,也有壞處。咱們依次的說明下。安全

好處:每個應用程序(也就是每個進程)都會有一個內存預算,全部運行在這個進程中的程序使用的總內存不能超過這個值,讓組件運行不一樣的進程中,可讓主進程能夠擁有更多的空間資源。當咱們的應用程序比較大,須要的內存資源比較多時(也就是用戶會抱怨應用常常出現OutOfMemory時),能夠考慮使用多進程。bash

壞處:每一個進程都會有本身的虛擬機實例,所以讓在進程間共享一些數據變得相對困難,須要採用進程間的通訊來實現數據的共享。網絡

2、線程

線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。多線程

在Android中,線程會有那麼幾種狀態:建立、就緒、運行、阻塞、結束。當應用程序有組件在運行時,UI線程是處於運行狀態的。默認狀況下,應用的全部組件的操做都是在UI線程裏完成的,包括響應用戶的操做(觸摸,點擊等),組件生命週期方法的調用,UI的更新等。所以若是UI線程處理阻塞狀態時(在線程裏作一些耗時的操做,如網絡鏈接等),就會不能響應各類操做,若是阻塞時間達到5秒,就會讓程序處於ANR(application not response)狀態。併發

1.線程做用

減小程序在併發執行時所付出的時空開銷,提升操做系統的併發性能。app

2.線程分類

守護線程、非守護線程(用戶線程)異步

2.1 守護線程

定義:守護用戶線程的線程,即在程序運行時爲其餘線程提供一種通用服務post

常見:如垃圾回收線程性能

設置方式:thread.setDaemon(true);//設置該線程爲守護線程

2.2 非守護線程(用戶線程)

主線程 & 子線程。

2.2.1 主線程(UI線程)

定義:Android系統在程序啓動時會自動啓動一條主線程

做用:處理四大組件與用戶進行交互的事情(如UI、界面交互相關)

由於用戶隨時會與界面發生交互,所以主線程任什麼時候候都必須保持很高的響應速度,因此主線程不容許進行耗時操做,不然會出現ANR。

2.2.2 子線程(工做線程)

定義:手動建立的線程

做用:耗時的操做(網絡請求、I/O操做等)

2.3 守護線程與非守護線程的區別和聯繫

區別:虛擬機是否已退出,即

a. 當全部用戶線程結束時,由於沒有守護的必要,因此守護線程也會終止,虛擬機也一樣退出

b. 反過來,只要任何用戶線程還在運行,守護線程就不會終止,虛擬機就不會退出

3.線程優先級

3.1 表示

線程優先級分爲10個級別,分別用Thread類常量表示。

Thread.MIN_PRIORITY //優先級1
Thread.MAX_PRIORITY //優先級10
複製代碼
3.2 設置

經過方法setPriority(int grade)進行優先級設置,默認線程優先級是5,即 Thread.NORM_PRIORITY。

4.線程狀態

建立狀態:當用 new 操做符建立一個線程的時候

就緒狀態:調用 start 方法,處於就緒狀態的線程並不必定立刻就會執行 run 方法,還須要等待CPU的調度

運行狀態:CPU 開始調度線程,並開始執行 run 方法

阻塞(掛起)狀態:線程的執行過程當中因爲一些緣由進入阻塞狀態,好比:調用 sleep/wait 方法、嘗試去獲得一個鎖等

結束(消亡)狀態:run 方法執行完 或者 執行過程當中遇到了一個異常

(1)start()和run()的區別

經過調用Thread類的start()方法來啓動一個線程,這時此線程是處於就緒狀態,並無運行。調用Thread類調用run()方法來完成其運行操做的,方法run()稱爲線程體,它包含了要執行的這個線程的內容,run()運行結束,此線程終止,而後CPU再調度其它線程。

(2)sleep()、wait()、yield()的區別

sleep()方法屬於Thread類,wait()方法屬於Object類。

調用sleep()方法,線程不會釋放對象鎖,只是暫停執行指定的時間,會自動恢復運行狀態;調用wait()方法,線程會放棄對象鎖,進入等待此對象的等待鎖定池,不調用notify()方法,線程永遠處於就緒(掛起)狀態。

yield()直接由運行狀態跳回就緒狀態,表示退讓線程,讓出CPU,讓CPU調度器從新調度。禮讓可能成功,也可能不成功,也就是說,回到調度器和其餘線程進行公平競爭。

3、進程和線程的區別

  1. 線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位; 進程是系統調度和資源分配的一個獨立單位;

  2. 線程不擁有系統資源; 進程能夠申請和擁有系統資源;

  3. 線程間資源共享; 進程間經過IPC實現資源共享;

4、多線程

1.Android線程的原則

  • 不能再主線程中作耗時操做

  • 不能再非UI線程中更新UI

(1)爲何不能再主線程中作耗時操做

防止ANR, 不能在UI主線程中作耗時的操做,所以咱們能夠把耗時的操做放在另外一個工做線程中去作。操做完成後,再通知UI主線程作出相應的響應。這就須要掌握線程間通訊的方式了。 在Android中提供了兩種線程間的通訊方式:一種是AsyncTask機制,另外一種是Handler機制。

(2)爲何不能在非UI線程中更新UI 由於Android的UI線程是非線程安全的,應用更新UI,是調用invalidate()方法來實現界面的重繪,而invalidate()方法是非線程安全的,也就是說當咱們在非UI線程來更新UI時,可能會有其餘的線程或UI線程也在更新UI,這就會致使界面更新的不一樣步。所以咱們不能在非UI主線程中作更新UI的操做。

2.Android實現多線程的幾種方式

(1)implements Runnable
(2)extends Thread
(3)handler機制
    handler.sendMessage()
    handler.post(Runnable action)
         view.post(Runnable action) //實質也是handler.post
         activity.runOnUiThread(Runnable action)  //實質也是handler.post
(4)AsyncTask
(5)HandlerThread
(6)IntentService
(7)ThreadPool
複製代碼

3.爲什麼須要多線程

多線程的本質就是異步處理,直觀一點說就是不要讓用戶感受到「很卡」。

4.多線程機制的核心是啥

多線程核心機制是Handler

相關文章
相關標籤/搜索