java 實現多線程的兩種方式


一.問題引入

        說到這兩個方法就不得不說多線程,說到多線程就不得不提實現多線程的兩種方式繼承Thread類和實現Runable接口,下面先看這兩種方式的區別。

二. Java中實現多線程的兩種方式

1.  繼承Thread類

 

/**
 * 使用Thread類模擬4個售票窗口共同賣100張火車票的程序,實際上是各賣100張
 */
public class ThreadTest {

    public static void main(String[] args){
        new MyThread().start();
        new MyThread().start();
        new MyThread().start();
        new MyThread().start();
    }
    
    //也可以把類寫在外邊
    public static class MyThread extends Thread{
        private int tickets=100;
        public void run() {
            while(tickets>0){
                System.out.println(this.getName()+"賣出第【"+tickets--+"】張火車票");
            }
        }
    }
}

 

2.  實現Runable接口

 

/**
 * 使用Runnable接口模擬4個售票窗口共同賣100張火車票的程序
 */
public class RunnableTest {

    public static void main(String[] args) {
        Runnable runnable=new MyThread();
        new Thread(runnable).start();
        new Thread(runnable).start();
        new Thread(runnable).start();
        new Thread(runnable).start();
    }
    
    public static class MyThread implements Runnable{
        private int tickets=100;
        public void run() {
            while(tickets>0){
                System.out.println(Thread.currentThread().getName()+"賣出第【"+tickets--+"】張火車票");
            }
        }
    }
}

 

不管采用哪種方式,覆蓋run方法時既可以用內部類也可以用外部類,不過一般采用內部類。

      3.  兩種方式的比較

實際中往往采用實現Runable接口,一方面因為java只支持單繼承,繼承了Thread類就無法再繼續繼承其它類,而且Runable接口只有一個run方法;另一方面通過結果可以看出實現Runable接口才是真正的多線程……

三.兩種方法的區別

       1) start:

用 start方法來啟動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。通過調用Thread類的 start()方法來啟動一個線程,這時此線程處於就緒(可運行)狀態,並沒有運行,一旦得到cpu時間片,就開始執行run()方法,這里方法 run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。

       2) run:

run() 方法只是類的一個普通方法而已,如果直接調用Run方法,程序中依然只有主線程這一個線程,其程序執行路徑還是只有一條,還是要順序執行,還是要等待 run方法體執行完畢后才可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。總結:調用start方法方可啟動線程,而run方法只是thread的一 個普通方法調用,還是在主線程里執行。這兩個方法應該都比較熟悉,把需要並行處理的代碼放在run()方法中,start()方法啟動線程將自動調用 run()方法,這是由jvm的內存機制規定的。並且run()方法必須是public訪問權限,返回值類型為void.。

 

 

 


免責聲明!

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



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