好程式設計師分享大資料教程之執行緒高階部分
好程式設計師分享大資料教程之執行緒高階部分,首先講一下執行緒的生命週期
> 對於一個執行緒 , 在被建立後 , 不是立即就進入到了執行狀態 , 也不是一直處於執行狀態 , 線上程的宣告週期中 , 一個執行緒會在多種狀態之間進行切換
>
>
>
> new : 新生狀態 , 執行緒被例項化 , 但是還沒有開始執行 (start)
>
> runnable: 就緒狀態 , 已經執行過 start, 執行緒已經啟動了 , 只是沒有搶到 CPU 時間片
>
> running: 執行狀態 , 搶到了 CPU 時間片
>
> blocked: 阻塞狀態 , 執行緒執行的過程中 , 遇到一些特殊情況 , 會進入阻塞狀態 . 阻塞中的執行緒 , 是不能引數時間片的搶奪的 ( 不能被執行緒排程器排程 )
>
> dead: 死亡狀態 , 執行緒終止
>
> 正常死亡 : run 方法中的程式碼執行結束
>
> 非正常死亡 : 強制使用 stop 方法停止這個執行緒
#### 臨界資源問題
> 由於執行緒之間是資源共享的。如果有多個執行緒,同時對一個資料進行操作,此時這個資料會出現問題。
> 如果有一個執行緒在訪問一個臨界資源,在訪問之前,先對這個資源“上鎖”,此時如果有其他的執行緒也需要訪問這個臨界資源,需要先查這個資源有沒有被上鎖,如果沒有被上鎖,此時這個執行緒可以訪問這個資源;如果上鎖了,則此時這個執行緒進入阻塞狀態,等待解鎖。
#### 同步程式碼段
> ```java
> // 同步程式碼段
> // 小括號:就是鎖
> // 大括號:同步程式碼段,一般情況下,寫需要對臨界資源進行的操作
> synchronized () {
>
> }
> // 關於同步鎖:可以分成兩種:物件鎖、類鎖
> //
> ```
>
#### 同步方法
> ```java
> // 使用 synchronized 關鍵字修飾的方法就是同步方法
> // 將一個方法中所有的程式碼進行一個同步
> // 相當於將一個方法中所有的程式碼都放到一個 synchronized 程式碼段中
> // 同步方法的鎖:
> // 1. 如果這個方法是一個非靜態方法:鎖是 this
> // 2. 如果這個方法是一個靜態方法:鎖是類鎖(當前類 .class )
> private synchronized void sellTicket() {
> }
> ```
>
#### lock 與 unlock
> 就是一個類 RenntrantLock
#### 執行緒死鎖 ( 瞭解 )
在解決臨界資源問題的時候,我們引入了一個" 鎖 " 的概念。我們可以用鎖對一個資源進行保護。實際,在多執行緒的環境下,有可能會出現一種情況:
> 假設有 A 和 B 兩個執行緒,其中執行緒 A 持有鎖標記 a ,執行緒 B 持有鎖標記 b ,而此時,執行緒 A 等待鎖標記 b 的釋放,執行緒 B 等待鎖標記 a 的釋放。這種情況,叫做 ** 死鎖 **
#### 生產者消費者設計模式
> wait() 、 notify() 、 notifyAll()
>
> wait(): 等待。使得當前的執行緒釋放鎖標記,進入等待佇列。可以使當前的執行緒進入阻塞狀態。
>
> notify(): 喚醒,喚醒等待佇列中的一個執行緒。
>
> notifyAll(): 喚醒,喚醒等待佇列中所有的執行緒。
> wait 和 sleep 的區別 :
>
> 1. 兩個方法都可以使一個執行緒進入阻塞。
> 2. 區別: wait 方法會釋放鎖標記, sleep 則不會釋放鎖標記。
#### 懶漢式單例設計模式中的執行緒安全問題
#### 執行緒池
> ThreadPoolExecutor 類是執行緒池最核心的類。這個類的構造方法中的幾個引數:
>
> int corePoolSize: 核心執行緒數量。核心池大小。
>
> int maxmiunPoolSize: 執行緒池中最多的執行緒數量。
>
> long keepAliveTime: 核心執行緒之外的臨時執行緒,能存活的時間。(從這個執行緒空閒的時候開始算)
>
> TimeUnit unit: 上面的時間單位
>
> NANOSECONDS: 納秒
>
> MICROSECONDS: 微秒
>
> MILLISEONDS: 毫秒
>
> SECONDS: 秒
>
> MINUTES: 分
>
> HOURS: 時
>
> DAYS: 天
>
> BlockingQueue<Runnable> workQueue: 等待佇列
>
> ArrayBlockingQueue
>
> LinkedBlockingQueue
>
> SynchronousQueue
>
> RejectedExecutionHandler handler :拒絕訪問策略
預習方向:
1. 網路程式設計
2. TCP
3. UDP
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2667589/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 大資料之執行緒高階部分大資料執行緒
- 好程式設計師大資料學習路線分享大資料之執行緒程式設計師大資料執行緒
- 好程式設計師大資料學習路線分享高階函式程式設計師大資料函式
- 好程式設計師大資料高階班分享 Spark知識點集合程式設計師大資料Spark
- 好程式設計師大資料高階班分享10個大資料專業術語程式設計師大資料
- 好程式設計師大資料學習路線分享執行緒學習筆記二程式設計師大資料執行緒筆記
- 好程式設計師大資料學習路線分享多執行緒學習筆記程式設計師大資料執行緒筆記
- 好程式設計師Java培訓分享Java多執行緒程式設計師Java執行緒
- JavaSE高階程式設計之多執行緒Java程式設計執行緒
- 好程式設計師大資料學習路線分享hive的執行方式程式設計師大資料Hive
- 好程式設計師大資料學習路線分享Hadoop階段的高可用配置程式設計師大資料Hadoop
- 好程式設計師大資料培訓分享Hadoop入門進階程式設計師大資料Hadoop
- 好程式設計師Java學習路線分享多執行緒概念程式設計師Java執行緒
- 好程式設計師Java培訓分享Java多執行緒併發程式設計師Java執行緒
- 好程式設計師web前端分享如何理解JS的單執行緒程式設計師Web前端JS執行緒
- 好程式設計師Python培訓分享Python中程式和執行緒詳解程式設計師Python執行緒
- 好程式設計師分享大資料三大必備技能程式設計師大資料
- 好程式設計師大資料培訓分享MapReduce理解程式設計師大資料
- 好程式設計師大資料教程分享大資料之流程控制程式設計師大資料
- 好程式設計師大資料培訓分享大資料的應用程式設計師大資料
- 好程式設計師大資料培訓分享大資料還學嗎?程式設計師大資料
- 好程式設計師Java教程分享Java多執行緒常見面試題程式設計師Java執行緒面試題
- 好程式設計師Java培訓分享四種常用執行緒池介紹程式設計師Java執行緒
- 好程式設計師大資料培訓分享mysql資料型別程式設計師大資料MySql資料型別
- 好程式設計師大資料教學點睛:Hadoop基礎篇程式設計師大資料Hadoop
- 好程式設計師大資料學習路線分享MAPREDUCE程式設計師大資料
- 好程式設計師大資料學習路線分享SparkSQl程式設計師大資料SparkSQL
- 好程式設計師大資料培訓分享HDFS讀流程程式設計師大資料
- 好程式設計師大資料培訓分享spark之Scala程式設計師大資料Spark
- 好程式設計師大資料教程分享:HDFS基本概念程式設計師大資料
- 好程式設計師雲端計算培訓分享msyql高階操作程式設計師
- 好程式設計師Python學習路線分享Linux和資料庫部分程式設計師PythonLinux資料庫
- 好程式設計師大資料學習路線分享大資料之字串程式設計師大資料字串
- 好程式設計師大資料培訓分享大資料的影響一程式設計師大資料
- 好程式設計師大資料培訓分享大資料兩大核心技術程式設計師大資料
- 好程式設計師大資料培訓分享怎樣進行大資料入門學習程式設計師大資料
- 好程式設計師Java學習路線分享MyBatis之執行緒最佳化程式設計師JavaMyBatis執行緒
- 好程式設計師大資料教程Scala系列之高階函式程式設計師大資料函式