1. 程式人生 > >程序與執行緒相關

程序與執行緒相關

程序:
    獨立性:程序是系統中獨立存在的實體。可以有自己的資源,每個程序都擁有自己私有的地址空間,沒有經過程序本身允許,一個使用者程序不能訪問其他程序空間
    動態性:程式是一個靜態指令集合,程序是一個正在系統中活動的指令集和,在程序中加入時間概念,程序有自己的生命週期和各種不同的狀態
    併發性:多個程序可以再耽擱處理器上併發執行,多個進城之間不會相互影響

併發:同一時刻只有一條指令執行,多條指令被快速輪換執行
並行:同一時刻,多條指令在多個處理器上同時執行

執行緒:執行緒是程序的執行單元。執行緒在程式中,是獨立併發的執行流。程序被初始化後,主執行緒就被建立。一個程序可以擁有多個執行緒,一個執行緒必須有一個父程序,
     執行緒可以有自己的堆疊,自己的程式計數器和自己的區域性變數,但是不再擁有系統資源,與父程序的其他執行緒共享該程序擁有的全部資源。
     同一程序中的執行緒可以併發執行
     
多執行緒程式設計優點: 程序間不能共享記憶體,執行緒中共享記憶體很容易
                系統建立程序需要為程序重新分配資源,建立執行緒代價小,實現多工併發效率高
                java內建多執行緒功能支援,

啟動執行緒使用start方法,不是run方法,呼叫start方法,系統吧run方法當做執行緒執行體處理,如果呼叫run方法,,run方法會立即執行
run方法返回之前其他執行緒無法併發執行,

Runnable:
        執行緒類實現了Runnable介面,還可以繼承其他類
        多個執行緒共享一個target物件,適合多個相同執行緒處理同一份資源,可以將    CPU,程式碼,資料分開,形成清晰模型,體現面向物件
        劣勢:程式設計複雜,需要訪問當前執行緒,必須使用功能Thread.currentThread()方法
Thread: 
        劣勢:已經繼承Thread類,不能再繼承其他類
        優勢:編寫簡單,如:需要訪問當前執行緒,直接this
        
執行緒生命週期: 新建(New) 就緒(Runnable) 執行(Running) 阻塞(Blocked) 死亡(Dead)

新建:new之後,jvm分配了記憶體,初始化成員變數,但是這個物件沒有任何執行緒動態特性,程式不會執行執行緒的執行緒執行體

就緒:物件呼叫了start()方法之後,為其建立方法呼叫棧和程式計數器,但是沒有執行,只是表示可以執行

執行:就緒狀態的執行緒獲得CPU,開始執行run方法的執行緒執行體,為執行狀態,如果只有一個CPU,在任何時刻只有一條執行緒執行狀態

阻塞:執行緒不可能一直處於執行狀態,
    執行緒呼叫sleep方法主動放棄所佔用的處理器資源
    執行緒呼叫阻塞IO方法,在方法返回之前,執行緒被阻塞
    執行緒試圖獲得一個同步監視器,但是這個同步監視器被其他執行緒所有,
    執行緒正在等待通知(notify)
    程式呼叫執行緒的suspend方法將執行緒掛起,但是容易死鎖

令阻塞進入就緒狀態:
                呼叫的sleep方法的執行緒經過了指定的時間
                執行緒呼叫的阻塞io方法已經返回
                執行緒成功獲得了試圖得到的監視器
                執行緒正在等待摸個通知,其他執行緒發出了通知
                處於掛起的執行緒被呼叫了resume方法3
            
死亡:run()方法執行完畢,執行緒正常結束
    執行緒丟擲一個未捕獲的Exception或者是error
    直接呼叫執行緒的stop()方法結束執行緒,這個方法容易導致死鎖
    

join執行緒:Thread提供讓一個執行緒等待另一個完成的方法,當呼叫其他執行緒的jion方法,呼叫執行緒被阻塞,知道被join方法加入的join執行緒完成

yield:執行緒讓步  可以讓當前正在執行的執行緒暫停,但是不會阻塞執行緒,將執行緒轉入就緒狀態
        當某個執行緒呼叫了yield方法暫停後,只有優先順序與當前執行緒相同,或者是優先順序比當前執行緒更高的執行緒才會獲得執行機會

sleep與yield方法的區別:
                    sleep暫停當前執行緒後,回給其他執行緒執行機會,yield只會給優先順序相同或者是更高階的執行緒
                    sleep會將執行緒轉入阻塞狀態,之後進入就緒狀態,yield會將執行緒進入就緒狀態,
                    sleep方法丟擲InterruptedException異常,呼叫sleep需要捕捉異常
                    sleep有更好的可移植性
        
同步方法:synchronized修飾的方法,無需指定同步監視器,同步方法的同步監視器是this
        使用同步方法的類是執行緒安全的類,該類的物件可以被多個執行緒安全訪問,
        每個執行緒呼叫該物件的任一方法都將得到正確結果
        每個執行緒呼叫該物件的任一方法,該物件狀態依然保持合理性
執行緒釋放同步監視器的鎖定: 當前執行緒的同步方法,同步程式碼塊執行結束,當前執行緒釋放同步監視器
                        執行緒在同步程式碼塊,同步方法中遇到break return終止程式碼塊,方法的繼續執行,當前執行緒釋放同步監視器
                        執行緒在同步程式碼塊,同步方法中遇到未處理的error 或exception ,導致程式碼塊,方法異常結束
                        執行緒在執行同步程式碼塊,同步方法時程式執行了同步監視器的wait()方法,當前執行緒暫停,執行緒釋放同步監視器
                        
執行緒不會釋放同步監視器的鎖定: 執行緒在執行同步程式碼塊,同步方法時,程式呼叫了Thread.sleep()Thread.yield ()方法來暫停當前執行緒的執行
                            執行緒執行同步程式碼塊時,其他執行緒呼叫了該執行緒的suspend方法將該執行緒掛起,不會釋放        
                            
執行緒的協調執行:Object中的wait()notity()notityAll()方法,
            對應使用synchronized修飾的同步方法,因為該類的預設例項(this)是同步監視器,所以可以直接在同步方法中呼叫
            對於使用synchronized修飾的同步程式碼塊,同步監視器,是synchronized後的物件,所以必須使用物件呼叫
            
    wait()當前執行緒等待,知道其他執行緒呼叫該同步監視器的notify()方法或notifyAll()方法喚醒執行緒。呼叫wait方法的當前執行緒會釋放對同步監視器的鎖定
    notify()喚醒在此同步監視器上等待的單個執行緒,如果所有執行緒都在此同步監視器上等待,會選擇喚醒其中一個執行緒,
    notifyAll()喚醒在此同步監視器上等待的所有執行緒,只有當前執行緒放棄對該同步監視器的鎖定後,才可以執行被喚醒的執行緒
    

使用條件變數控制協調
            Conditon類:lock.newCondition()
            await():使執行緒等待,知道其他執行緒呼叫該Condition的signal()方法,或signalAll()方法,
            signal()喚醒Lock物件上等待的單個執行緒
            signalAll()喚醒所有執行緒