java多線程學習筆記

一、線程的創建

1.  通過繼承Thread類,重寫Thread的run()方法,將線程運行的邏輯放在其中

      2.  通過實現Runnable接口,實例化Thread類


        但是在使用Runnable定義的子類中沒有start()方法,只有Thread類中才有。此時觀察Thread類,有一個構造方法:public Thread(Runnable targer)此構造方法接受Runnable的子類實例,也就是說可以通過Thread類來啓動Runnable實現的多線程。(start()可以協調系統的資源)

兩種實現方式的區別和聯繫:

        在程序開發中只要是多線程肯定永遠以實現Runnable接口爲主,因爲實現Runnable接口相比繼承Thread類有如下好處:

        避免點繼承的侷限,一個類可以繼承多個接口。

        適合於資源的共享


    二、線程的生命週期

// 開始線程
publicvoid start( );
publicvoid run( );
// 掛起和喚醒線程
publicvoid resume( );     // 不建議使用
publicvoid suspend( );    // 不建議使用
publicstaticvoid sleep(long millis);
publicstaticvoid sleep(long millis, int nanos);
// 終止線程
publicvoid stop( );       // 不建議使用
publicvoid interrupt( );
// 得到線程狀態
publicboolean isAlive( );
publicboolean isInterrupted( );
publicstaticboolean interrupted( );
// join方法
publicvoid join( ) throws InterruptedException;

1、調用Thread.sleep():使當前線程睡眠至少多少毫秒(儘管它可能在指定的時間之前被中斷)。

2、調用Thread.yield():不能保障太多事情,儘管通常它會讓當前運行線程回到可運行性狀態,使得有相同優先級的線程有機會執行。

3、調用join()方法:保證當前線程停止執行,直到該線程所加入的線程完成爲止。然而,如果它加入的線程沒有存活,則當前線程不需要停止。

    

三、線程同步

1、線程同步的目的是爲了保護多個線程反問一個資源時對資源的破壞。

2、線程同步方法是通過鎖來實現,每個對象都有切僅有一個鎖,這個鎖與一個特定的對象關聯,線程一旦獲取了對象鎖,其他訪問該對象的線程就無法再訪問該對象的其他同步方法。

3、對於靜態同步方法,鎖是針對這個類的,鎖對象是該類的Class對象。靜態和非靜態方法的鎖互不干預。一個線程獲得鎖,當在一個同步方法中訪問另外對象上的同步方法時,會獲取這兩個對象鎖。

4、對於同步,要時刻清醒在哪個對象上同步,這是關鍵。

5、編寫線程安全的類,需要時刻注意對多個線程競爭訪問資源的邏輯和安全做出正確的判斷,對原子操作做出分析,並保證原子操作期間別的線程無法訪問競爭資源。

6、當多個線程等待一個對象鎖時,沒有獲取到鎖的線程將發生阻塞。

7、死鎖是線程間相互等待鎖鎖造成的,在實際中發生的概率非常的小。真讓你寫個死鎖程序,不一定好使,呵呵。但是,一旦程序發生死鎖,程序將死掉。


四、一些常見問題

 

1、線程的名字,一個運行中的線程總是有名字的,名字有兩個來源,一個是虛擬機自己給的名字,一個是你自己的定的名字。在沒有指定線程名字的情況下,虛擬機總會爲線程指定名字,並且主線程的名字總是mian,非主線程的名字不確定。

2、線程都可以設置名字,也可以獲取線程的名字,連主線程也不例外。

3、獲取當前線程的對象的方法是:Thread.currentThread()

4、在上面的代碼中,只能保證:每個線程都將啓動,每個線程都將運行直到完成。一系列線程以某種順序啓動並不意味着將按該順序執行。對於任何一組啓動的線程來說,調度程序不能保證其執行次序,持續時間也無法保證。

5、當線程目標run()方法結束時該線程完成。

6、一旦線程啓動,它就永遠不能再重新啓動。只有一個新的線程可以被啓動,並且只能一次。一個可運行的線程或死線程可以被重新啓動。

7、線程的調度是JVM的一部分,在一個CPU的機器上上,實際上一次只能運行一個線程。一次只有一個線程棧執行。JVM線程調度程序決定實際運行哪個處於可運行狀態的線程。

衆多可運行線程中的某一個會被選中做爲當前線程。可運行線程被選擇運行的順序是沒有保障的。

8、儘管通常採用隊列形式,但這是沒有保障的。隊列形式是指當一個線程完成一輪時,它移到可運行隊列的尾部等待,直到它最終排隊到該隊列的前端爲止,它才能被再次選中。事實上,我們把它稱爲可運行池而不是一個可運行隊列,目的是幫助認識線程並不都是以某種有保障的順序排列唱呢個一個隊列的事實。

9、儘管我們沒有無法控制線程調度程序,但可以通過別的方式來影響線程調度的方式。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章