線程基礎、同步、阻塞隊列、線程池、AsynTask異步任務
一:線程基礎
1.進程與線程
進程:是操作系統結構的基礎,是程序在一個數據集合上的運行過程,是系統進行資源分配和調度的基本單位。
線程:是操作系統調度的最小單位。
2.線程的狀態
New:新創建狀態。
Runnable:可運行狀態。(注意:此狀態不一定在運行,主要取決於cpu是否給線程運行起來)
Blocked:阻塞狀態。表示被鎖阻塞,他暫時不活動。
Waiting:等待狀態。線程暫時不活動。
Timed waiting:超時等待狀態。和等待狀態不同,在規定時間內會被自動喚醒。
Terminated:終止狀態。表示線程已經執行完畢。
具體關於狀態詳細內容可以參考:https://blog.csdn.net/pange1991/article/details/53860651
3.創建線程
①.繼承Thread類,實現run()方法
②.實現Runnable方法,並實現接口的run()方法
③.實現Callable接口,重寫call()方法。是線程池中的方法,Callable屬於Executor框架功能類
一般推薦使用第二種,實現Runnable方法。
4.理解中斷
①.Thread.currentThread.isInterrupted()方法使其線程中斷
②.在線程處於阻塞情況下中斷標識符為true會拋出異常InterruptedException,應該對異常進行處理
③.調用中斷方法並不一定會中斷,如果線程比較重要,則不會被中斷。
二:同步
同步:解決線程高併發問題。
1.重入鎖與條件對象
重入鎖ReentrantLock(相當於synchronized)是Java 5.0引入的,重入鎖結構確保任何時刻只有一個線程進入臨界區。如下所示結構
臨界區就是同一時刻只能有一個任務訪問的代碼區。
注意在finally釋放鎖。如下所示。
Lock mLock = new ReentrantLock(); mLock.lock(); try{ ... } finally{ mLock.unlock(); } AI寫代碼 一個鎖對象可以獲得多個條件對象,可以用newCondition方法獲得一個條件對象。
得到條件對象後調用await方法(相當於wait方法),當前線程就放棄鎖,進入等待隊列。
同一條件對象調用signalAll(相當於notifyAll)方法會重新激活這一條件等待的所有線程。
同一條件對象調用signal(相當於notify)方法會隨機激活一個同一對象的線程。
同步代碼塊一般比較脆弱,儘量使用同步方法。
2.volatile
volatile關鍵字為實例域的同步訪問提供了免鎖機制。
①.Java內存模型抽象概念:線程的共享變量存在主存中,每個線程有一個私有的本地內存,本地內存存儲着共享變量的副本。如下圖: ———————————————— 版權聲明:本文為CSDN博主「龔禮鵬」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/gongjdde/article/details/90292505