1. 程式人生 > >java基礎常見問題解析(六) 執行緒+併發機制

java基礎常見問題解析(六) 執行緒+併發機制

java執行緒+併發機制

  1. 有關執行緒的哪些敘述是對的
    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併發機制

  1. 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 是並列的 互不影響的
    }
}