Java基礎總結--多線程總結2

來源:互聯網
上載者:User

標籤:描述   sum   參數   字串   切換   標記   同步代碼塊   不同   工具   

----多線程通訊-----
1.概述:多個線程處理同一個資源,但是各自的任務不相同
eg:線程1負責儲存資料,線程2負責處理該資料。資料--就是同一個資源
怎樣用java語言描述上面的例子:
* 資源是變化的--資料是變化的--將其封裝為對象
* 存在兩個任務不同的線程,需要2個run方法--所以封裝在兩個不同的線程類中
* 必須保證輸入和輸出處理的是同一個對象-輸入輸出構造方法傳參數(參數為資來源物件引用)
* 主函數裡面,建立資來源物件,線程類對象,啟動線程
2.多線程通訊依然會出現安全執行緒的問題
解決辦法--同步,在儲存資源加同步,但是依然會出錯--確保需要同步的都同步
想想同步的前提:同一個鎖--多個線程:在輸入和輸出線程都加同步一個鎖保證同步的實現
注意:關於結果的一定分析:輸入線程獲得執行權,不斷的進行賦值操作(會切換),等到時
間片結束後,執行權到輸出線程,然後輸出線程也會執行一段時間,所以導致輸出一大片相
同的情況的出現
3.線程的等待和喚醒機制(重要)----控制輸入線程和輸出線程的合作
輸入-先判斷有資料嗎--無則輸入,有則等待(存在執行權-要釋放執行權和執行資格)-阻塞並
喚醒對方 wait()+notify()
輸出-先判斷有資料嗎--有則取出,無則等待(存在執行權-要釋放執行權和執行資格)-阻塞並
喚醒對方 wait()+notify()
輸入線程與輸出線程互相喚醒對方,阻塞是自我的阻塞
涉及到的方法:
wait():讓線程處於阻塞狀態,被wait的線程被儲存線上程池當中
notify():喚醒線程池裡面任意的一個線程
notifyAll():喚醒線程池裡面所有的線程-讓線程具備執行資格
注意:
1.這些方法必須定義在同步中,因為這些方法是用於操作線程狀態的方法,必須要明確到底
操作的是那個鎖上的線程(wait/notify控制某個鎖範圍內的線程)。
所以調用wait/notify方法必須由多線程對應的鎖調用:r.wait/notify
2.wait/notify是在Object裡面定義的方法(原因:這些方法是監視器的方法,監視器可以是
任意的對象,所以定義在Object裡面),用來操作指定監視器上的線程。
3.wait--throws InterruptedException
4.對於資源的資料應該私人,對外提供訪問的方法(保證資源資料同步,喚醒阻塞控制);對
於線程體只僅僅的調用這些方法就可以,不需要再進行額外的處理安全執行緒以及順序控制
鎖在那裡--wait、notify就在那裡
5.注意:if是為真執行,wait後,run裡面的內容不再繼續向下執行

----等待喚醒機制的應用----生產者消費者問題-----
代碼類比一個生產者--一個消費者
1.Rescource
2.Producer
3.Consumer
代碼類比多生產者(t0,t1)--多消費者(t2,t3)
多生產多消費會出現錯誤原因---t0喚醒t1後,t1直接不進行標記的判斷直接生產,導致
前一個產品未被消費,又生產了新的產品。改進if判斷改為while迴圈,會可能出現死
鎖,t0,t1,t2,t3都處於阻塞狀態。改進想要保證喚醒對方,只好使用notifyAll方法,喚醒所
有被阻塞的方法,本方活,會判斷不會盲目生產,對方活了,就能解決死結。
注意:使用if判斷,只會進行判斷一次,會導致不該啟動並執行線程運行,導致資料錯誤
使用notify方法:只是隨機的喚醒一個線程,可能就是本方的線程,進而導致死結
使用while迴圈--保證線程被喚醒後,線程是否要執行
使用notifyAll()解決死結保證喚醒的線程包含對方線程
多生產多消費 使用while+notifyAll(效率不好,喚醒本方要進行判斷)
新的工具-java.util.concurrent.locks包(包含一些類和介面)--對synchronized的替代
JDK1.5後將同步封裝為對象,並將操作鎖的隱式定義封裝到對象中,將隱式變為顯示
try-catch-finally(一定會釋放互斥鎖)

新工具Lock介面(替代synchronized相關)+Condition介面(封裝await/single/singleAll方法
)組合使用。一個鎖對象--可以附帶多組等待喚醒方法
Lock lock = new ReeectrantLock();
Condition c1 = lock.newCondition();//lock鎖對象--兩組監視器方法
Condition c2 = lock.newCondition();
之前出現死結--是沒有互相喚醒,或就是去全部喚醒(一個組監視器方法監視生產者消費者)
現在改進後,採用兩組監視器方法分別監視生產者和消費者,保證可以實現相互喚醒

關於新工具的總結:
Lock介面:出現的原因是為了替代同步代碼塊/同步方法,將同步的隱式鎖操作變為顯示的鎖
操作,同時更加靈活,可以在一個鎖對象上面加多組監視器
Condition介面:出現替代了Object裡面的wait/notify/notifyAll方法,將這些監視器方法
進行單獨封裝,變成Condition監視器對象,可以和任意鎖對象進行組合
對應的監視器方法變為:await/singal/singalAll

---wait/sleep區別----(重要)
1.wait可以指定時間,可以不指定時間;sleep必須指定時間
2.在同步中對CPU的執行權和鎖的處理不同
線程wait後,釋放執行權,釋放鎖(必須被喚醒不是主動喚醒)
線程sleep後,釋放執行權,但是不會釋放鎖
3.to,t1,t2都在同步中被wait並釋放執行資格和執行權和鎖,t4喚醒全部線程,t0,t1,t2,此
時在同步中被喚醒具有執行資格,但是不具備執行權,因為t4還持有鎖,t4執行完後釋放鎖
,被喚醒的3個線程中的一個線程被CPU調度,獲得鎖開始執行線程的內容。
本質:在同步中,只有持有鎖的線程可以運行

-----線程的停止-------
1.stop方法--過時存在不安全性(強制終止線程)
2.run方法執行完後就正常終止(裡面一般都具備迴圈)
3.之所以使用多線程就是解決,程式中某段代碼執行此時過多,影響下面代碼的執行,所以
通常把迴圈放線上程裡面,下面的代碼方主線程裡面,讓它們並發執行,可以提高效率
-----怎樣控制線程任務結束---
任務都會有迴圈結構,只要控制住迴圈就可以結束任務
控制迴圈:通常使用定義條件標記完成
對外提供公開的修改標記值的方法,並在主線程中調用該方法就可以停止線程
4.同步中如何停止線程(線程處於凍結狀態-沒有機會讀到標記)
interrupt方法--在調用sleep,wait等方法處於凍結狀態後,調用interrupt方法可以清除中
斷狀態--將線程的凍結狀態變為可運行狀態 (中斷--是一種凍結狀態)
中斷狀態被清除:線程狀態由凍結變為可執行狀態
interrupt方法--會拋出InterruptedExcption(線上程不該醒來的時候叫醒線程)-記得要處理
該異常。在catch裡面修改標記
notify--只能喚醒wait的方法
interrupt--強制的喚醒-一定會出現中斷異常
eg:一個kiss叫醒--notify
一棒打醒---interrupt
結束進程:其實就是強制的將進程裡面的線程都結束並釋放該片記憶體空間
系統級的進程使用者不能進行結束

----線程中其他常見線程方法----
setDaemon()將線程設為守護線程,正在啟動並執行所有線程都是守護線程,JVM停止運行
使用時機:在啟動線程前調用
後台線程:開始運行相同,結束不同,前台線程必須手動結束,後台線程可以在前台線程都
結束後,自動結束。後台線程依附於前台線程。
join();線程調用該方法後(在主線程中調用),主線程釋放執行權和執行資格,讓該線程執行
完後,該線程正常終止,主線程獲得執行資格再和其他線程奪取執行權
一般用於臨時加入線程--運算
setPriority():設定線程優先順序;並不是優先順序越高就一定先執行,而是被執行的機率大一
些,1-10,把常見的優先順序1,5,10定義為靜態常量。
toString():線程對象具備對應的字串表現形式
yield():主動釋放一次執行權,下次的時候會和其他線程奪取執行權-靜態方法
建立線程的捷徑:使用匿名內部類

Java基礎總結--多線程總結2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.