|
好程序員大數(shù)據(jù)教程之線程高級部分,首先講一下線程的生命周期 > 對于一個線程, 在被創(chuàng)建后, 不是立即就進入到了運行狀態(tài), 也不是一直處于運行狀態(tài), 在線程的聲明周期中, 一個線程會在多種狀態(tài)之間進行切換 > > > > new : 新生狀態(tài), 線程被實例化, 但是還沒有開始執(zhí)行(start) > > runnable: 就緒狀態(tài), 已經(jīng)執(zhí)行過start, 線程已經(jīng)啟動了, 只是沒有搶到CPU時間片 > > running: 運行狀態(tài), 搶到了CPU時間片 > > blocked: 阻塞狀態(tài), 線程執(zhí)行的過程中, 遇到一些特殊情況, 會進入阻塞狀態(tài). 阻塞中的線程, 是不能參數(shù)時間片的搶奪的 (不能被線程調(diào)度器調(diào)度) > > dead: 死亡狀態(tài), 線程終止 > > 正常死亡 : run方法中的代碼執(zhí)行結(jié)束 > > 非正常死亡 : 強制使用stop方法停止這個線程 ![]() #### 臨界資源問題 > 由于線程之間是資源共享的。如果有多個線程,同時對一個數(shù)據(jù)進行操作,此時這個數(shù)據(jù)會出現(xiàn)問題。 > 如果有一個線程在訪問一個臨界資源,在訪問之前,先對這個資源“上鎖”,此時如果有其他的線程也需要訪問這個臨界資源,需要先查這個資源有沒有被上鎖,如果沒有被上鎖,此時這個線程可以訪問這個資源;如果上鎖了,則此時這個線程進入阻塞狀態(tài),等待解鎖。 ####同步代碼段 > ```java > // 同步代碼段 > // 小括號:就是鎖 > // 大括號:同步代碼段,一般情況下,寫需要對臨界資源進行的操作 > synchronized () { > > } > // 關(guān)于同步鎖:可以分成兩種:對象鎖、類鎖 > // > ``` > ####同步方法 > ```java > // 使用synchronized關(guān)鍵字修飾的方法就是同步方法 > // 將一個方法中所有的代碼進行一個同步 > // 相當(dāng)于將一個方法中所有的代碼都放到一個synchronized代碼段中 > // 同步方法的鎖: > // 1. 如果這個方法是一個非靜態(tài)方法:鎖是this > // 2. 如果這個方法是一個靜態(tài)方法:鎖是類鎖(當(dāng)前類.class) > private synchronized void sellTicket() { > } > ``` > #### lock與unlock > 就是一個類RenntrantLock #### 線程死鎖(了解) 在解決臨界資源問題的時候,我們引入了一個"鎖"的概念。我們可以用鎖對一個資源進行保護。實際,在多線程的環(huán)境下,有可能會出現(xiàn)一種情況: > 假設(shè)有A和B兩個線程,其中線程A持有鎖標(biāo)記a,線程B持有鎖標(biāo)記b,而此時,線程A等待鎖標(biāo)記b的釋放,線程B等待鎖標(biāo)記a的釋放。這種情況,叫做 **死鎖** #### 生產(chǎn)者消費者設(shè)計模式 > wait() 、notify() 、notifyAll() > > wait(): 等待。使得當(dāng)前的線程釋放鎖標(biāo)記,進入等待隊列??梢允巩?dāng)前的線程進入阻塞狀態(tài)。 > > notify(): 喚醒,喚醒等待隊列中的一個線程。 > > notifyAll(): 喚醒,喚醒等待隊列中所有的線程。 > wait和sleep的區(qū)別: > > 1. 兩個方法都可以使一個線程進入阻塞。 > 2. 區(qū)別:wait方法會釋放鎖標(biāo)記,sleep則不會釋放鎖標(biāo)記。 ####懶漢式單例設(shè)計模式中的線程安全問題 #### 線程池 > ThreadPoolExecutor類是線程池最核心的類。這個類的構(gòu)造方法中的幾個參數(shù): > > int corePoolSize: 核心線程數(shù)量。核心池大小。 > > int maxmiunPoolSize: 線程池中最多的線程數(shù)量。 > > long keepAliveTime: 核心線程之外的臨時線程,能存活的時間。(從這個線程空閑的時候開始算) > > TimeUnit unit: 上面的時間單位 > > NANOSECONDS: 納秒 > > MICROSECONDS: 微秒 > > MILLISEONDS: 毫秒 > > SECONDS: 秒 > > MINUTES: 分 > > HOURS: 時 > > DAYS: 天 > > BlockingQueue<Runnable> workQueue: 等待隊列 > > ArrayBlockingQueue > > LinkedBlockingQueue > > SynchronousQueue > > RejectedExecutionHandler handler:拒絕訪問策略 預(yù)習(xí)方向: 1. 網(wǎng)絡(luò)編程 2. TCP 3. UDP |
|
|