Java學習筆記之執行緒

左墾發表於2017-05-17
所謂執行緒就是程式的執行路徑,執行單元,為程式就是正在執行的應用程式,顧名思義,多程式就是一個程式的多個執行單元,執行路徑。
多執行緒的兩種方案
        繼承Thread類(檢視api簡單介紹Thread類):
        實現Runable介面:
    多執行緒的幾個問題:
        A:啟動執行緒用的是哪個方法
            start()
        B:start()和run()的區別
            start():1.開啟執行緒  2.執行run()方法裡面的程式碼
            run():執行的是執行緒裡面執行的程式碼,並不會開啟執行緒
        C:為什麼要重寫run()
            因為每個執行緒需要執行的程式碼都是都是不一樣的,
            我們需要將每個執行緒自己獨立執行的程式碼寫到run()方法中執行
        D:執行緒可以多次啟動嗎
            不可以,一個程式只能啟動一次,隨後與其他程式一起搶佔CPU的資源
    執行緒的排程和控制
        執行緒休眠(Thread.sleep(毫秒值))
        執行緒名稱(setName(),getName();)
        執行緒的排程及優先順序setPriority(10)(注意預設值是5,區間在1-10之間)
        執行緒優先順序:說白了就是設定你搶佔cpu執行權搶佔到的概率,規定了執行緒執行的順序
    多執行緒案例(兩種方式實現,睡一會出現執行緒安全問題):
        A.繼承Thread賣票
        B.實現Runnable賣票(睡一會出現執行緒安全問題) 

        問題:
        按照真實的情景加入了延遲,確發現出現了這樣的兩個問題:
        A:相同的票賣了多次
            CPU的一次操作必須是原子性的(操作是CPU執行一次就可以直接完成的)
        B:出現了負數的票
            隨機性和延遲導致的
        出現上面的問題稱為執行緒安全問題。
public class MyThread implements Runnable{
    int ticket = 100;
    Object obj = new Object();

    public void run(){
        while(true){
        //  synchronized (obj) {
            if(ticket>0){
                try{
                    Thread.sleep(100);
                }catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
            }
        System.out.println(Thread.currentThread().getName() 
                + "正在出售第" + ticket-- + "張票");
                }
        //  }   
        }
    }
}   
判斷執行緒安全問題:
        A:是否是多執行緒環境
        B:是否有共享資料
        C:是否有多條語句操作共享資料
    為了解決執行緒安全問題引入了同步程式碼塊(執行緒安全執行效率就低)
        synchronized(物件) {
            需要被同步的程式碼。
        }
        物件被稱為執行緒的鎖,對於多執行緒,所必須保證是同一把鎖;與同步程式碼塊相一致的解決方法
        有同步方法,和靜態同步方法,他們的鎖分別為此類的物件this和本類的位元組碼檔案物件:類名
        class。
    JDK5的Lock鎖,我們之前造的所有的鎖都沒有手動釋放鎖
        static Lock lock = new ReentrantLock();
        枷鎖:lock.lock();
        釋放鎖:lock.unlock();
        可以讓我們明確的知道在哪裡加鎖和釋放鎖。
        依然寫一個賣票的demo,用lock枷鎖釋放鎖,
        為了保證我們建立的鎖一定會被釋放,用一下程式碼進行改進
        try{....}finally{.....}

    死鎖問題
        同步巢狀,鎖裡面套了一個鎖,出現同步巢狀
        (簡單介紹,要求大家以後寫的時候需要注意)

    執行緒等待和喚醒機制(案例演示:waitThread,NotifyThread,MyLock,Test)
        鎖物件呼叫wait()鎖物件呼叫notify()

        注意:
        wait和sleep的區別
        執行緒等待,在等待的同時釋放鎖,而sleep()方法在執行的過程中是不會釋放鎖的

相關文章