android線程並發
⑴ android多核,多線程該如何用
在程序開發的實踐當中,為了讓程序表現得更加流暢,我們肯定會需要使用到多線程來提升程序的並發執行性能。但是編寫多線程並發的代碼一直以來都是一個相對棘手的問題,所以想要獲得更佳的程序性能,我們非常有必要掌握多線程並發編程的基礎技能。
眾所周知,Android 程序的大多數代碼操作都必須執行在主線程,例如系統事件(例如設備屏幕發生旋轉),輸入事件(例如用戶點擊滑動等),程序回調服務,UI 繪制以及鬧鍾事件等等。那麼我們在上述事件或者方法中插入的代碼也將執行在主線程。
一旦我們在主線程裡面添加了操作復雜的代碼,這些代碼就很可能阻礙主線程去響應點擊/滑動事件,阻礙主線程的 UI 繪制等等。我們知道,為了讓屏幕的刷新幀率達到 60fps,我們需要確保 16ms 內完成單次刷新的操作。一旦我們在主線程裡面執行的任務過於繁重就可能導致接收到刷新信號的時候因為資源被佔用而無法完成這次刷新操作,這樣就會產生掉幀的現象,刷新幀率自然也就跟著下降了(一旦刷新幀率降到 20fps 左右,用戶就可以明顯感知到卡頓不流暢了)。
為了避免上面提到的掉幀問題,我們需要使用多線程的技術方案,把那些操作復雜的任務移動到其他線程當中執行,這樣就不容易阻塞主線程的操作,也就減小了出現掉幀的可能性。
那麼問題來了,為主線程減輕負的多線程方案有哪些呢?這些方案分別適合在什麼場景下使用?Android 系統為我們提供了若干組工具類來幫助解決這個問題。
AsyncTask: 為 UI 線程與工作線程之間進行快速的切換提供一種簡單便捷的機制。適用於當下立即需要啟動,但是非同步執行的生命周期短暫的使用場景。
HandlerThread: 為某些回調方法或者等待某些任務的執行設置一個專屬的線程,並提供線程任務的調度機制。
ThreadPool: 把任務分解成不同的單元,分發到各個不同的線程上,進行同時並發處理。
IntentService: 適合於執行由 UI 觸發的後台 Service 任務,並可以把後台任務執行的情況通過一定的機制反饋給 UI。
了解這些系統提供的多線程工具類分別適合在什麼場景下,可以幫助我們選擇合適的解決方案,避免出現不可預期的麻煩。雖然使用多線程可以提高程序的並發量,但是我們需要特別注意因為引入多線程而可能伴隨而來的內存問題。舉個例子,在 Activity 內部定義的一個 AsyncTask,它屬於一個內部類,該類本身和外面的 Activity 是有引用關系的,如果 Activity 要銷毀的時候,AsyncTask 還仍然在運行,這會導致 Activity 沒有辦法完全釋放,從而引發內存泄漏。所以說,多線程是提升程序性能的有效手段之一,但是使用多線程卻需要十分謹慎小心,如果不了解背後的執行機制以及使用的注意事項,很可能引起嚴重的問題。
⑵ Android進程與線程區別
所以下來特地去查了以下資料,先說說線程:
(1)在Android APP中,只允許有一個主線程,進行UI的渲染等等,但是不能進行耗時操作(網路交互等等),否則會造成ANR,就是線程阻塞卡死,未響應。
(2)除了主線程之外,耗時操作都應該規范到子線程中,線程之間會有相應的通信方式,但相互獨立。
(3)然後看了一下所查資料:
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程比進程更小,基本上不擁有系統資源,故對它的調度所用資源小,能更高效的提高系統內多個程序間並發執行的。 嗯,從大的說就是這樣。
在平時的Android開發過程中,基本上都會用到線程handler,thread等等,具體的實現方法我就不在這里寫了。
進程:
根據所查資料:是一個具有獨立功能的程序關於某個數據集合的一次運行活動。進程是系統進行資源分配和調度的一個獨立單位。可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體,是一個「執行中的程序」。不只是程序的代碼,還包括當前的活動。
這應該是一個比較大的概念,存在於一個系統中,與線程的區別是:
1、子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文。
2、進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見。
3、進程間通信IPC,線程間可以直接讀寫進程數據段(如全局變數)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。
4、線程上下文切換比進程上下文切換要快得多。
⑶ android怎麼提高線程的優先順序
線程調度 計算機通常只有一個CPU,在任意時刻只能執行一條機器指令,每個線程只有獲得CPU的使用權才能執行指令.所謂多線程的並發運行,其實是指從宏觀上看,各個線程輪流獲得CPU的使用權,分別執行各自的任務.在運行池中,會有多個處於就緒狀態的線程在等待CPU,java虛擬機的一項任務就是負責線程的調度,線程調度是指按照特定機制為多個線程分配CPU的使用權. 有兩種調度模型:分時調度模型和搶占式調度模型。 分時調度模型是指讓所有的線程輪流獲得cpu的使用權,並且平均分配每個線程佔用的CPU的時間片這個也比較好理解。 java虛擬機採用搶占式調度模型,是指優先讓可運行池中優先順序高的線程佔用CPU,如果可運行池中的線程優先順序相同,那麼就隨機選擇一個線程,使其佔用CPU。處於運行狀態的線程會一直運行,直至它不得不放棄CPU。 一個線程會因為以下原因而放棄CPU。 1 java虛擬機讓當前線程暫時放棄CPU,轉到就緒狀態,使其它線程或者運行機會。 2 當前線程因為某些原因而進入阻塞狀態 3 線程結束運行 需要注意的是,線程的調度不是跨平台的,它 不僅僅取決於java虛擬機,還依賴於操作系統。在某些操作系統中,只要運行中的線程沒有遇到阻塞,就不會放棄CPU;在某些操作系統中,即使線程沒有遇到阻塞,也會運行一段時間後放棄CPU,給其它線程運行的機會。 java的線程調度是不分時的,同時啟動多個線程後,不能保證各個線程輪流獲得均等的CPU時間片。 如果希望明確地讓一個線程給另外一個線程運行的機會,可以採取以下辦法之一。 調整各個線程的優先順序 讓處於運行狀態的線程調用Thread.sleep()方法 讓處於運行狀態的線程調用Thread.yield()方法 讓處於運行狀態的線程調用另一個線程的join()方法
⑷ android進程和線程到底有什麼區別
進程:是一個具有獨立功能的程序關於某個數據集合的一次運行活動。進程是系統進行資源分配和調度的一個獨立單位。可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體,是一個「執行中的程序」。不只是程序的代碼,還包括當前的活動。
線程:線程是進程的一個實體,是CPU調度和分
派的基本單位,它是比進程更小的能獨立運行的基本單位。線程比進程更小,基本上不擁有系統資源,故對它的調度所用資源小,能更高效的提高系統內多個程序間並發執行的
程度。線程和進程的區別:
1、子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文。
2、進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見。
3、進程間通信IPC,線程間可以直接讀寫進程數據段(如全局變數)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。
4、線程上下文切換比進程上下文切換要快得多。
⑸ Android:在代碼中我start了一個Thread後,這個線程和原線程並發還是並行
並行、、、、新線程跟原(UI,也叫主線程)同時運行。
⑹ android 開4個線程 速度會提升4倍嗎
對於Android平台上的線程優先順序設置來說可以處理很多並發線程的阻塞問題,比如很多無關緊要的線程會佔用大量的CPU時間,雖然通過了MultiThread來解決慢速I/O但是合理分配優先順序對於並發編程來說十分重要。Android在線程方面主要使用的是Java本身的Thread類,我們可以在Thread或Runnable介面中的run方法首句加入 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //設置線程優先順序為後台,這樣當多個線程並發後很多無關緊要的線程分配的CPU時間將會減少,有利於主線程的處理,相關的Thread優先順序定義羅列有以下幾種: int THREAD_PRIORITY_AUDIO //標准音樂播放使用的線程優先順序 int THREAD_PRIORITY_BACKGROUND //標准後台程序 int THREAD_PRIORITY_DEFAULT // 默認應用的優先順序 int THREAD_PRIORITY_DISPLAY //標准顯示系統優先順序,主要是改善UI的刷新 int THREAD_PRIORITY_FOREGROUND //標准前台線程優先順序 int THREAD_PRIORITY_LESS_FAVORABLE //低於favorable int THREAD_PRIORITY_LOWEST //有效的線程最低的優先順序 int THREAD_PRIORITY_MORE_FAVORABLE //高於favorable int THREAD_PRIORITY_URGENT_AUDIO //標准較重要音頻播放優先順序 int THREAD_PRIORITY_URGENT_DISPLAY //標准較重要顯示優先順序,對於輸入事件同樣適用。
⑺ 安卓里的多線程並發指的是什麼
多線程並發和多線程管理,比如說一條線程專門負責讀取數據,一條線程專門負責輸出數據, 還有一條主線程專門用來顯示界面UI, 更新UI等這些就是多線程了.
⑻ android 一個進程 多少個線程
一個程序可以有很多進程,一個進程可以包含多個線程。我們在寫程序的時候,一般要用到並發,這里講的是線程。
⑼ Android中線程與線程,進程與進程之間如何通信
使用handler發送message,消息隊列排隊
進程是一個具有獨立功能的程序關於某個數據集合的一次運行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不只是程序的代碼,還包括當前的活動,通過程序計數器的值和處理寄存器的內容來表示。
進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時,它才能成為一個活動的實體,我們稱其為進程。
通常在一個進程中可以包含若干個線程,它們可以利用進程所擁有的資源。在引入線程的操作系統中,通常都是把進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位。由於線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統內多個程序間並發執行的程度。
線程和進程的區別在於,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文。多線程主要是為了節約CPU時間,發揮利用,根據具體情況而定。線程的運行中需要使用計算機的內存資源和CPU。
⑽ android 線程是同時運行還是有先後次序
CPU盡可能的將時間盡量分配給每一個線程使其有機會唄CPU運行從表面上看似同時運行 但微觀上是走走停停的,這種現象稱之為並發現象。 哪個線程誰得到CPU的運行時間誰先運行 。。。