記一次Java多線程的基本概念(one)

                              再愛不回頭。可如果是你,那就讓我回頭下吧。

 

最近在項目中使用了多線程,初次體驗效果還是很不錯的,所以有有必要學習下和記錄下,雖然以前是學過一段時間,但是主要是對付面試,就沒有很深入的進入學習,所以這次是深入進去學習下多線程的。這篇文章主要就是記錄下線程的基本信息。個人認爲,多線程是我們必須學的,同時也是必須要學好的部分。

 

線程的狀態說明 : 

1 : 新建狀態(New) : 線程對象被創建後,就進入了新建狀態。

  比如 : Thread trhead = new Thread(); 代碼就是這樣理解

 

2 : 就緒狀態 (Runnable):  就緒狀態也可以稱爲: 可執行狀態。線程對象創建後,其他線程調用了該對象的start()方法,來啓動線程.

 比如 : thread.start(); 就是主線程來調用thread對象的start方法,就是處理就緒狀態,隨時都可能被CPU調度執行.

 

3 : 運行狀態 (Running): 線程獲取CPU權限進行執行。需要注意的是,線程只能從就緒狀態進入到運行狀態。 

 

4 : 阻塞狀態 (Blocked): 阻塞狀態是線程因爲某種原因放棄CPU使用權,暫停使用權,直到線程進入到就緒狀態,纔有機會轉到運行狀態.阻塞的狀態有如下的幾種 : 

    4.1 : 等待阻塞 :  -- 通過調用線程的wait()方法,讓線程等待某工作的完成.

    4.2 : 同步阻塞 : 線程在獲取synchronized同步鎖失敗(因爲鎖被其它線程所佔用),它會進入同步阻塞狀態。(synchronized會在後續說到,同一個對象,synchronized修改的多個方法,只有一個方法在同一時刻是可以調用的,其他的線程都會被阻塞起來,如果沒synchronized修飾的方法就不會進行阻塞.)

    4.3 : 其他阻塞 : 通過調用線程的sleep()或join()或發出了I/O請求時,線程會進入到阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。

 

5 : 死亡狀態(Dead) : 線程執行完了或者因異常退出了run()方法,該線程結束了生命週期。

 

如下是線程狀態的圖片說明

 

2 : 實現線程的方法有

   2.1 : 直接繼承Thread : 代碼如下

   

package com.yang.create;

/***********************************************************************
 *<PRE>
 *
 *  File Name       :  創建線程的方式一 ;  繼承Thread 實現run方法
 *
 *  Creation Date   : 19-9-12
 *
 *  Author          : Gavin
 *
 *  Purpose         : 
 *
 *  History         : 
 *
 *</PRE>
 ***************************************************************************/

public class CreateThreadFunctionOne extends Thread {

    public CreateThreadFunctionOne(String name){ super(name); }

    @Override
    public void run() {
        for(int i=0;i<20;i++){
            System.out.println(this.getName() + " : " + i);
        }
    }

    public static void main(String[] args) {

        for(int i=0;i<5;i++){
            new CreateThreadFunctionOne("Thread Number : " + i).start();
        }

    }
}

 

 2.2 實現 Runnable 接口 : 代碼如下

    

package com.yang.create;

/***********************************************************************
 *<PRE>
 *
 *  File Name       : 創建線程方法二
 *
 *
 *  Creation Date   : 19-9-12
 *
 *  Author          : Gavin
 *
 *  Purpose         :  實現 Runnable接口,重寫run方法
 *
 *  History         : 
 *
 *</PRE>
 ***************************************************************************/
public class CreateThreadFunctionTwo implements Runnable {


    @Override
    public void run() {

        for(int i=0;i<20;i++){
            System.out.println(Thread.currentThread().getName() + " Number : " + i);
        }

    }

    public static void main(String[] args) {

        for(int i=0;i<5;i++){
            CreateThreadFunctionTwo createThreadFunctionTwo = new CreateThreadFunctionTwo();
            new Thread(createThreadFunctionTwo,"thread : " + i).start();
        }

    }

}

 Thread 和 Runnable 的相同點:

都是實現多線程的方式

 

Thread 和 Runnable 不同點是 : 

Thread 是類,Runnable 是接口,Thread類本身是實現了Runnable 類的接口。

我們知道“一個類只能有一個父類,但是卻能實現多個接口”,因此Runnable具有更好的擴展性。

此外,Runnable還可以用於“資源的共享”。即,多個線程都是基於某一個Runnable對象建立的,它們會共享Runnable對象上的資源。

通常,建議通過“Runnable”實現多線程!

 

 

 

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