Java線程,java多線程
線程、進程概念:
進程: 在Java語言中,當用Java命令執行.class檔案或執行.exe檔案,會首先將程式碼Load到記憶體區,然後由作業系統找到程式碼的入口(main方法)開始執行程式。以上是關於Java程式執行過程的記憶體分析的內容。當把程式碼Load到記憶體區時,已經算是一個進程了,這時它並沒有執行,這裡強調進程是個靜態的概念。我個人認為,如果強調它是個靜態概念,就把進程和線程割裂開來說了。把進程解釋為記憶體中啟動並執行應用程式也未為不可。儘管我們常說的進程開始執行了,實質上是程式中的主線程開始執行了。線程:
是一個程式中不同的執行路徑。多進程:
同時在記憶體中運行多個應用程式。多線程:
對於單個CPU,實質上是不存在多線程的。CPU只能輪換處理多個線程,在某一時刻,只能處理一個線程,但是因為處理的速度極快,人根本感覺不到它輪換處理線程的時間差,所以給人的感覺是“同時”在執行多個線程,這也就是分時複用。對於多個CPU,才會存在多線程。
線程建立和啟動:
線程定義和線程執行個體化(兩種方式) 1.子類繼承Thread,重寫Run方法------>new 子類() 2.實現Runnable介面------>調用Thread構造方法new Thread(Runnable target)線程啟動 調用Thread對象的Start方法
線程狀態轉換:
新狀態:線程對象已經建立,但還沒有調用start()方法 就緒狀態:調用start()方法,但發送器還沒有把它選定為啟動並執行線程(即還沒有調用Run方法) 運行狀態:被選定為當前執行的線程,執行Run方法 阻塞/等待/睡眠狀態:某種事件發生,線程進入阻塞狀態,帶阻塞解除,重新回到就緒狀態,等待調度。 死亡態:線程的Run方法完成時,就認為它死去。
線程式控制制方法:
1.睡眠 Thread.sleep() 使當前正在執行的線程暫停執行,開始睡眠,睡眠指定時間長度後,自動蘇醒,進入就緒狀態,而不是運行狀態。 2.設定線程優先順序
setPriority() 3.線程讓步 Yield()理論上是讓具有相同優先順序的線程具有啟動並執行機會,本身由當前執行的線程從運行狀態回到就緒狀態,但是可能會被再次選中,並不能保證真正的讓步。 4.線程合并 在一個A線程中如果加入B線程.Join,則A線程會等B線程執行完,才執行。
線程同步和鎖機制:
synchronized關鍵字 Java語言的關鍵字,可用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候,同一時刻最多隻有一個線程執行這個段代碼。 當兩個並發 線程訪問同一個對象object中的這個加鎖同步代碼塊時,一個時間內只能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼塊以後才能執行 該代碼塊。 然而,當一個線程訪問object的一個加鎖代碼塊時,另一個線程仍然可以訪問該object中的非加鎖代碼塊。
當一個線程訪問object的一個synchronized(this)同步代碼塊時,其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。
Wait釋放當前線程在該對象上所獲得的鎖 當一個線程獲得了對象的鎖之後,即使該線程在Sleep,也不會釋放這個鎖。
總結:
這章的痛點是對線程同步的理解與運用,不過,明白線程同步發生的情境,並把握住synchronized關鍵字的作用,也就是上述的幾條,理解起來也就容易了些。