線程的2種實現方式


1.繼承Thread類

聲明一個內部(外部)類,假如名字叫做 Thread1,繼承Thread類,重寫(Override)其中的run方法。

定義一個類,里面再定義一個Thread1類型的對象,調用start()方法。

舉個例子吧:

public class ThreadTest1 {
public static void main(String[] args){
    Thread1 t1 = new Thread1();
    t1.start();   
}
}

class Thread1 extends Thread{
    @Override   
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println("Thread 111111-------"+i);
        }
    }
}

 

2.實現Runnable接口

聲明一個內部(外部)類,假如名字叫做MyThread,實現Runnable接口,實現其中的run方法。

定義一個類,里面定義一個Thread類型的對象,把MyThread的對象當作參數傳遞進去,調用start方法。

public class ThreadTest2 {
public static void main(String[] args){
    MyThread mt = new MyThread();
    Thread t2 = new Thread(mt);
    //上面2行可以寫成 Thread t2 = new Thread(new MyThread());
    t2.start();  
}
}

class MyThread implements Runnable{
    @Override   
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println("Thread 22222-------"+i);
        }
    }
}

3.比較一下兩種方法吧

從我自己的理解來看,實現Runnable接口的代碼更健壯。

原因很簡單,java是單繼承的,從長遠假設來看,也許這個類改天想干點其它的事情,必須再繼承某個類,因為你已經繼承了Thread類,你就不能再繼承了。

接口之所以靈活就在於,你可以實現多個接口,而且實現接口了還可以繼續繼承一個類,所以呢,給程序員帶來更大的靈活性。

 

4、 線程狀態說明

線程狀態從大的方面來說,可歸結為:初始狀態、可運行狀態、不可運行狀態和消亡狀態,具體可細分為上圖所示7個狀態,說明如下:

1) 線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable接口,但不管怎樣,當我們new了thread實例后,線程就進入了初始狀態;

2) 當該對象調用了start()方法,就進入可運行狀態;

3) 進入可運行狀態后,當該對象被操作系統選中,獲得CPU時間片就會進入運行狀態;

4) 進入運行狀態后case就比較多,大致有如下情形:

﹒run()方法或main()方法結束后,線程就進入終止狀態;

﹒當線程調用了自身的sleep()方法或其他線程的join()方法,就會進入阻塞狀態(該狀態既停止當前線程,但並不釋放所占有的資源)。當sleep()結束或join()結束后,該線程進入可運行狀態,繼續等待OS分配時間片;

﹒當線程剛進入可運行狀態(注意,還沒運行),發現將要調用的資源被鎖牢(synchroniza,lock),將會立即進入鎖池狀態,等待獲取鎖標記(這時的鎖池里也許已經有了其他線程在等待獲取鎖標記,這時它們處於隊列狀態,既先到先得),一旦線程獲得鎖標記后,就轉入可運行狀態,等待OS分配CPU時間片;

﹒當線程調用wait()方法后會進入等待隊列(進入這個狀態會釋放所占有的所有資源,與阻塞狀態不同),進入這個狀態后,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒(由於notify()只是喚醒一個線程,但我們由不能確定具體喚醒的是哪一個線程,也許我們需要喚醒的線程不能夠被喚醒,因此在實際使用時,一般都用notifyAll()方法,喚醒有所線程),線程被喚醒后會進入鎖池,等待獲取鎖標記。

﹒當線程調用stop方法,即可使線程進入消亡狀態,但是由於stop方法是不安全的,不鼓勵使用,大家可以通過run方法里的條件變通實現線程的stop。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM