java基礎常見問題解析(六) 執行緒+併發機制
java執行緒+併發機制
- 有關執行緒的哪些敘述是對的
a. 一旦一個執行緒被建立,它就立即開始執行(需要等待CPU排程)
b. 當一個執行緒因為搶先機制而停止執行,它被放在可執行佇列的前面
c. 一個執行緒可能因為不同的原因停止(cease)並進入就緒狀態(時間片已到)
d. 使用start()方法可以使一個執行緒成為可執行的,但是它不一定立即開始執行
執行緒的狀態
執行緒有五個狀態:
建立狀態:執行緒被建立
就緒狀態:執行緒一旦被建立,等待CPU的呼叫—形成就緒佇列
執行狀態:就緒狀態的執行緒被CPU選中被執行,當時間片輪轉排程到期後 執行緒由執行狀態進行就緒狀態
等待狀態:執行緒執行過過程中由於缺少資源或者其他原因將中途被迫退出 ,即進入等待狀態。當滿足資源條件的時候,執行緒由等待狀態進行就緒狀態,重新等待CPU的排程(就緒狀態不能回到等待狀態)
結束狀態:執行緒正常執行完畢,進入結束狀態(等待狀態可以直接進入結束狀態 如果發生死鎖,計算機不加與干預,系統根據策略將等待狀態的程序直接轉到結束狀態 —非正常結束)
start和run的區別
class MyThead extends Thread {
@Override
public void run() {
System.out.println("當前執行緒的名稱為:" + Thread.currentThread().getName());
}
}
public class ThreadDemo {
public static void main(String[] args) {
System.out.println("執行main方法的執行緒名稱為:" + Thread.currentThread().getName() );
MyThead my1=new MyThead();
MyThead my2=new MyThead();
// my1.run();//main 執行緒就是main run方法不是真正的呼叫執行緒
// my2.run();//main 執行緒就是main
// 執行緒已經就緒完畢,隨時可以執行,但是是否被cpu選中還需要看執行緒的佇列(考慮策略和權重)
my1.start();//Thread-0
my2.start();//Thread-1
}
}
java併發機制
- Java 語言中,負責併發管理的機制是
a. 垃圾回收機制(防止記憶體洩漏,但不能避免)
b. 虛擬機器機制(實際上是幫助我們實現java跨平臺機制)
c. 程式碼安全性檢查機制(執行時機制,保證程式碼具有安全性,java虛擬機器在執行class檔案要進行安全性檢查)
d. 多執行緒
程式碼安全性檢查機制 三個環節
java轉成class檔案在執行class檔案之前三步操作
1.通過類載入器ClassLoader把class檔案載入到JVM(執行的java虛擬機器)
2.通過位元組碼校驗器 校驗class檔案是否有潛在的安全性漏洞(比如記憶體洩漏,try catch捕獲)
3.執行java解析器 解析class檔案
*java垃圾回收機制
Object finalize()方法 來實現 —-主要負責垃圾回收
主要功能用子類來實現
方法介紹:
Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. A subclass overrides the finalize method to dispose of system resources or to perform other cleanup.
class Demo {
@Override
protected void finalize() throws Throwable {
// 此方法被呼叫說明,呼叫當前方法的物件會被回收
System.out.println("finalizer方法被呼叫,呼叫當前方法的執行緒為:"
+ Thread.currentThread().getName());
}
}
public class GCDemo {
public static void main(String[] args) {
Demo demo=new Demo();//該物件不會被回收
// 沒有變數引用,則說明該物件是垃圾,預設情況垃圾回收器不會立即回收,這取決於記憶體是否充足
new Demo();//需要多測試幾次
// 可以手動呼叫垃圾回收器執行緒,回收垃圾物件
System.gc();//輸出Finalizer 垃圾回收執行緒號
throw new RuntimeException();//在拋錯的情況下不影響垃圾回收執行緒的執行 說明垃圾回收執行緒 和 主執行緒main 是並列的 互不影響的
}
}