java執行緒 一些重點難點

jinux111發表於2013-10-09

1.基礎:Runnable 和 Thread

在java中我們可以通過繼承Thread類來實現一個執行緒。

class TaskThread extends Thread{
    @Override
    public void run() {
        super.run();//呼叫了Thread的run()方法,檢視原始碼可以知道它呼叫了下面講得Runnable子類的run方法

        //執行緒要執行的操作在這
    }
}

但是有時候我們的某個類需要繼承其他類,這樣java為了實現多繼承,提供了Runnable這個介面。

class Task extends DownLoadFile implements Runnable{
    public void run() {
    }
}

這裡我們繼承了DownLoadFile這個類實現了Runnable這個介面,這樣我們就可以在一個獨立執行緒裡下載東西了


用一個Thread的時候很簡單,就是例項化,然後呼叫它的start()就可以了,當呼叫start()時,它先建立一個執行緒,然後在新執行緒裡呼叫run方法

Thread taskThread=new TaskThread();   //此時建立了一個物件,和其他物件的建立一樣,此時與新執行緒沒什麼關係

taskThread.start();//呼叫start(),新執行緒才出現

用Runnable時稍微複雜一點,因為Runnable要以來Thread,建立新執行緒的事還是要Thread來辦

Task task=new Task();              //例項化一個Task

taskThread=new Thread(task);//把task傳給Thread物件

taskThread.start();//此時會建立新執行緒,並執行task的run方法


2.執行緒體

執行緒體是一個執行緒要執行的一系列指令

所以對於Thread,它的執行緒體是run方法

如果我們不用Thread,我們的程式依然有一個執行緒,叫主執行緒,它的執行緒體對於我們java程式設計師來說是main方法


3.類,物件,執行緒

一個類可以例項化多個物件

而一個執行緒,它可以用到多個類的靜態方法,多個例項


4.執行緒同步

    這裡只說一說wait 和 notify 執行緒同步方法,但它們依賴“監視器”

    ”監視器“,是什麼呢,它就是一個物件,不過是有條件的,這就需要先說說synchronized這個java關鍵字,它的意思是同步的。(說到”同步“,到底是什麼意思呢,現在有各種同步軟體,那是資料同步,就是保持多個地點的資料一致。我們這裡說的是執行緒同步,是要使得多個執行緒的步調一致,有個先後順序。所以synchronized修飾的方法或語句塊不會讓多個執行緒同時進入。)

   ”監視器“和synchronized有什麼關係呢?

        (1) synchronized 修飾非靜態方法,此時在這個方法體內的就有了 ”監視器“,它是所在類的物件.

                                                synchronized void func(){}

         (2) synchronized 修飾靜態方法,此時在這個方法體內的也有了 ”監視器“,它是所在類的物件.

                                                static synchronized void func(){}

          (3) synchronized 修飾語句塊,此時需要一個引數,而這個引數就作為“監視器”。

                                               synchronized(Object o){

                                            

                                                }

  “監視器”有什麼作用呢?

   其實它的名字很形象,它不能被多個執行緒同時擁有,而要想進入synchronized修飾的方法或語句塊需要先獲得這個“監視器”,這樣就好像監視不讓多個執行緒同時進入的,當一個執行緒已經進入後,在來的執行緒會被阻塞在該方法前等待。同時它還提供了控制已經進入的執行緒的方法 wait和notify,notifyAll(終於回到只想說的這裡來了)

 

   wait 和 notify,notifyAll

   wait方法會使的當前執行緒停止,並且主動放棄”監視器“,此時它等待其它執行緒用通知它,只有其他執行緒呼叫了notify或notifyAll時它才有可能繼續。此時,如果有其它執行緒在等待,就可以進入了(這樣不就兩個執行緒同時進入了嗎,的確是的,但是隻有一個在執行。所以不能同時多個執行緒獲得同一個“監視器”。)

   notify就是用來通知wait的執行緒醒過來的。它會通知一個,但不知是哪一個,notifyAll則會讓所有的都醒來。(notify只能在同步方法內呼叫,當它呼叫notify通知一個同步方法內正在wait的執行緒,這樣不就多個執行緒同時執行了嗎?恩,所以java的notify是在呼叫執行緒出來以後再去喚醒的。但是,但是,notifyAll呢????經過實驗,當多個等待的執行緒都被通知醒來時,雖然他們都醒來了,但是依然只有一個可以執行,等它退出,再選一個執行)


     ( 所有不確定的選擇都有執行緒排程機制來處理。)  



    總算完了。部落格內容是通過我實驗和對文件理解得出的,如果有錯誤,歡迎指正,若有補充,更是歡迎




相關文章