標籤:總結 java thread 線程
一、概念進程-->進行中中的程式。
迅雷下載時將一個檔案拆分為5部分,是為了跟CPU爭奪資源。
拆分的5部分,每一部分都稱之為線程。
線程是程式中的控制單元,或者叫執行路徑。
每一個進程執行都有一個執行順序,該順序是一個執行路徑,
每一個程式開啟,都會在記憶體中分配一塊空間。
進程就是為了定義,標識這個空間的,它用於封裝裡面的控制單元。
線程就是進程中的一個獨立的控制單元,線程在控制著進程的執行。
一個進程中至少有一個線程,線程是進程中的內容。
JVM 啟動的時候會有一個進程Java.exe
該進程中至少有一個線程負責java程式的執行,
而且這個線程啟動並執行代碼存在與main方法中。
該線程稱之為主線程。
擴充:
其實更細節說明虛擬機器jvm,jvm啟動不止一個線程,還有負責記憶體回收機制的線程。
多線程的意義:
為了使代碼同時運行,便於執行提高效率。
二、Thread類:用於描述控制單元(線程)這類事物的類。該類定義了一個功能,用於儲存線程要啟動並執行代碼,該儲存功能就是run方法。
也就是說Tread類中的run方法,用於儲存線程要啟動並執行代碼。
進程、線程都是由系統幫我們建立的,java已經提供好了對這種操作的描述和體現。
建立新執行線程的兩種方法:
1、將類聲明為Tread的子類,該子類應重寫run方法。
為什麼要重寫run方法呢?
目的:將自訂的代碼儲存在run方法中,讓線程運行。
2、實現Runnable介面,覆寫run方法。
將Runnable介面的子類對象作為參數傳遞給Thread的建構函式。
實現方式和繼承方式有什麼區別?
繼承Thread:線程代碼存放在Thread子類run方法中。
實現Runnable:線程代碼存在介面的子類run方法中。
實現方式的好處:避免了單繼承的局限性。
在定義線程時,建立使用實現方式。
注意:如果僅僅調用run方法不能實現多線程。因為線程沒有被開啟。
start方法有兩個作用:開啟線程並執行該線程的run方法。
瞭解:
早期的一些病毒就是開啟n多線程“搶劫”CPU資源造成死機。
多線程看似實現了程式的同時執行,其實是CPU在做著快速的切換。
多線程的特性:隨機性。
瞭解:
多核可以實現同時執行,前提是記憶體得夠大。
線程的四種狀態:
start() sleep(time)
被建立--------->運行----------------->凍結:放棄了執行資格
| wait()
| stop()or run方法結束
└------>消亡
第五種狀態:
臨時狀態
阻塞:具備運行資格,但沒有執行權
sleep:到時間會自動運行
wait:需要別人喚醒——notify方法
線程的方法:
|---getName():返回線程的名稱Tread-0,從0開始
|---setName():設定線程的名稱。
|---在構造中可以直接設定名稱。
|---currentThread:static返回當前正在執行的線程對象
多線程存在的問題:
寫多線程一定要小心安全問題。
當多條語句在操作同一個線程共用資料時,一個線程對多條語句只
執行了一部分,還沒有執行完,另一個線程參與進來執行,導致共
享資料的錯誤。
解決辦法:
對多條操作共用資料的語句,只能讓一個線程都執行完。
在執行過程中,其他線程不可以參與執行。——同步代碼塊。
synchronized(對象){
需要被同步的代碼
}
對象如同鎖,持有鎖的線程可以在同步中執行。
沒有鎖的線程即使擷取cpu的執行權,也進不去,因為沒有擷取鎖。
同步的前提:
1、必須要有兩個或以上的線程。
2、必須是多個線程使用同一個鎖。
好處:解決了多線程的安全問題,
弊端:多個線程需要判斷鎖,較為消耗資源。
如何找問題:
1、明確哪些代碼是多線程運行代碼。
2、明確共用資料。
3、明確多線程運行代碼中哪些語句是操作共用資料的。
同步函數
public synchronized void add(int i)
函數需要被對象調用,以上用同步函數的話沒有傳入對象,預設的就是this
注意:如果同步函數被靜態修時候,使用的鎖是什麼呢?
反正不是this,因為靜態方法中也不可以定義this。
靜態進記憶體中,沒有本類對象,但是一定有該類對應的位元組嗎檔案對象。
類名.class 該對象的類型是class。
單例設計模式懶漢式的安全問題:
解決方案:
class Single{private static Single s=null;private Single(){}public static Single getInstance(){if(s==null){synchronized(Single.class){if(s==null){s=new Single();}}}}}
面試考點:懶漢式的特點在於,消極式載入。
使用多線程時會出現安全隱患,可以用同步解決,但較為低效,
可以用多重判斷解決這個低效問題,鎖用的是該類所屬的位元組碼檔案對象。
死結:
同步中嵌套同步,但鎖不同。
死結程式:
package Demos;public class Demo_06 {public static void main(String[] args) {new DeadLock(false).start();new DeadLock(true).start();}}class DeadLock extends Thread{private boolean flag=false;DeadLock(boolean flag){this.flag=flag;}@Overridepublic void run() {if(flag){synchronized(Lock.lockA){System.out.println("if lockA");synchronized(Lock.lockB){System.out.println("if lockB");}}}else{synchronized(Lock.lockB){System.out.println("else lockA");synchronized(Lock.lockA){System.out.println("else lockB");}}}}}class Lock{static Object lockA=new Object();static Object lockB=new Object();}
Java多線程知識整理