關於java多線程的回顧

現在想起來,多線程也是學了很久了,由於最近做到一個小遊戲坦克大戰中需要用來一些關於多線程的只是,所以現在想回顧一下之前學過的多線程的東西,廢話少說,開始慢慢複習!
首先說說java的多線程,多線程是個很神奇的東西,它可以讓一個進程(可以理解爲一個程序)中同時存在多任務執行的情況,對於一個java程序來說,一個進程中至少有一個線程,那就是存在於main方法中的主線程,其實對於java程序來說,是不只一個線程的,例如還有負責java垃圾回收機制的線程,線程是進程中一個獨立的控制單元,當進程中有多個線程在同時執行時,他們都持有cpu的執行權,CPU執行到誰,誰就開始執行,CPU是不能同時執行多個線程的,當然,多核CPU除外!在整個執行過程中,CPU一直在做着快速的切換。這是多線程的一個特性:隨機性,通俗點說就是誰搶到了CPU的執行權,那麼誰就開始執行。
那麼,說到這裏,既然某個時刻只有一個線程能運行,那麼其他線程都處於什麼狀態呢?這裏就必須得說說線程的五種狀態了(有些書上說的是五種,有些書上說的是六種,但是其實原理是一樣的,說六種的只是稍微細分了一下而已).
[線程狀態圖一覽](https://img-blog.csdn.net/20150413195044558)
由圖可以看出,當線程具備執行資格但是沒有執行權時,那麼它處於一種阻塞的狀態。

那麼說完了線程的基本概念,來說說線程的創建方式,線程有兩種創建的方式,第一種:繼承Thread類,並且覆蓋run方法,代碼如下:

public class ThreadDemo{
    public static void main(String[] args){
        Thread1 t = new Thread1();
        t.start();

        for(int i = 0;i<100;i++){
            System.out.println("主線程啓動");
        }
    }
}
class Thread1 extends Thread{
    public void run(){
        for(int i = 0;i < 100;i++){
            System.out.println("線程1啓動");
        }
    }
}

這個小程序運行之後會發現,每次都會有不同的結果,這就驗證了CPU一直在各線程之間來回切換這一點。
在這個小程序中,可能初學者會有許多問題,問題1:
爲什麼要覆蓋run方法呢?
Thread類用於描述線程,其中run方法的作用是存儲該線程需要運行的自定義程序代碼.就好像main方法中存儲着主線程需要運行的代碼一樣!
問題2:start方法的作用是什麼?
1.啓動線程
2.調用run方法

下面是創建線程的第二種方式,實現Runnable接口,代碼如下:模擬賣票的一個小程序

public class TicketDemo{
    public static void main(String[] args){
        Ticket t = new Ticket();//創建一個Ticket對象
        //將Ticket對象作爲參數傳入創建的四個線程中,實現車票數據的共享
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);
        Thread t4 = new Thread(t);
        //將四個線程分別啓動
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
class Ticket implements Runnable{
    private int ticket = 100;
    //覆蓋接口中的run方法
    public void run(){
        for(int i = 1;i<ticket;i++){
            System.out.println(Thread.currentThread().getName()+"sale...."ticket--);
        }
    }
}

上面的這個小程序說明了實現Runnable接口的創建線程的方法,需要說明的是如果用第一種方法創建
線程來實現這個賣票的小程序是行不通的,因爲第一種採用繼承的方式來創建線程,不能實現車票數
據的共享,那樣的話創建四個線程意味着每個線程賣一百張票。一共是賣400張票!
到這裏,要說下繼承與實現的區別:
繼承Thread類:線程代碼存放在Thread子類的run方法中
實現Runnable接口:線程代碼存放在Runnable子類的run方法中
實現的好處:避免的單繼承的侷限性。所以在定義線程時,一般都使用第二種方式來創建線程

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