包(package){
1.對類文件進行分類管理
2.包與包之間進行訪問,被訪問的包中的類是public,且該類方法也要是public
3.只有繼承類的子類才能使用該類中protected修飾的方法
4.import導入包中的類,用哪個導入哪個,放在代碼第一行
}
線程{
進程與線程{
進程:正在進行的程序
線程:進程中一個負責程序執行的控制單元
1.一個進程有多個線程,即多個執行路徑
2.一個進程至少一個線程
3.多個線程是爲了同時運行多部分代碼,且每個都有獨立的運行內容
4.如果線程過多,相應的效率降低
}
創建線程的目的是爲開啓一條執行路徑,去運行指定的代碼和其他的代碼實現同事運行,而運行的指定代碼就是這個執行路徑的任務,
JVM創建的主線程任務都定義在main函數當中
Thread類是用於描述線程的,線程需要任務,所以該類也是對任務描述,通過run方法體現出來,run方法是封裝了自定義線程的任務
第一種創建線程方法{
1.定義一個類並繼承Thread
2.覆蓋run方法,把線程任務封裝進該方法
3.創建該類對象並執行start方法
}
第二種創建線程方法{
1.定義一個類,實現Runnable(一個將線程的任務進行了對象封裝的接口)
2.覆蓋run方法,將執行任務放進去
3.通過Thread類創建一個線程對象,並將實現Runnable的類的對象作爲構造函數的參數傳遞
4.調用線程對象的start方法開啓線程
}
獲取線程方法{
通過Thread類的getName方法,當繼承Thread的類創建對象就有一個名字 ,就是該線程的名字
如果想要獲得正在運行的線程的名字就需要Thread.currentThread().getName(),先獲得正在運行線程的引用再獲得該對象名字,
}
產生安全性問題{
前提:1.多個線程在操作共享的數據 2.操作共享數據的線程代碼有多條
原因:當一個線程在執行操作共享數據的多條代碼過程中,其他線程也參與了該數據的運算就導致問題的產生
}
解決辦法:通過同步代碼塊將多條語句進行封裝類似有一把鎖,當該代碼塊第一次被一線程執行的時候這個線程就有了該鎖的鑰匙,其他線程就無法獲得鑰匙
弊端:每一個線程都要判斷是否擁有該鎖的鑰匙
格式:synchronized(對象){ } //對象---相當於這把鎖的名稱,不同的鎖對應不同的鑰匙
同步函數:public synchronized void show(){ }該函數的鎖爲this,
同步代碼塊的鎖爲自定義
靜態函數的鎖爲類的字節碼文件對象,可通過兩種方式獲取 1.類名.class(常用,靜態函數有可能不需要對象) 2.this.getClass()
}