線程基礎、同步、阻塞隊列、線程池、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