1. 程式人生 > >java之Runnable和Thread區別與實現方法

java之Runnable和Thread區別與實現方法

1、多執行緒中start()和run()方法的區別

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

2) run:
run()方法只是類的一個普通方法而已,如果直接呼叫Run方法,程式中依然只有主執行緒這一個執行緒,其程式執行路徑還是隻有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的程式碼,這樣就沒有達到寫執行緒的目的。

2、兩者區別與實現方法

實現Thread

MyThread mt1=new MyThread("執行緒a");  
MyThread mt2=new MyThread("執行緒b");  
mt1.start();  
mt2.start();  

實現Runnable
Runnable裡面沒有start方法可以通過Thread類進行啟動Runnable多執行緒
Runnable可以用的同一個物件例項化的,可以資源共享,Thread不可以
MyThread實現runnable介面

  MyThread mt=new MyThread();    
    new Thread
(mt).start(); new Thread(mt).start(); new Thread(mt).start();

用runnable啟動一個執行緒

Test impelements Runnable;//定義執行緒類
Test t = new Test();//
//由此行代替前面兩行
Runnable t=new Runnable(){
        @Override
        public void run() {
            // TODO Auto-generated method stub

        }
    };

Thread test = new
Thread(t); test.start();

runnable的好處:
避免點繼承的侷限,一個類可以繼承多個介面。
適合於資源的共享

3、賣票例子:

Thread方法實現

package Test1;  
class MyThread extends Thread{  

    private int ticket = 10;  
    private String name;  
    public MyThread(String name){  
        this.name =name;  
    }  

    public void run(){  
        for(int i =0;i<500;i++){  
            if(this.ticket>0){  
                System.out.println(this.name+"賣票---->"+(this.ticket--));  
            }  
        }  
    }  
}  
public class ThreadDemo {  


    public static void main(String[] args) {  
        MyThread mt1= new MyThread("一號視窗");  
        MyThread mt2= new MyThread("二號視窗");  
        MyThread mt3= new MyThread("三號視窗");  
        mt1.start();  
        mt2.start();  
        mt3.start();  
    }  

}  

執行結果
這裡寫圖片描述

Runnable方法實現

public class Test1 implements Runnable{

    private int ticket = 10;

    @Override
    public  void run() {
        for(int i =0;i<10;i++){
            //新增同步快
            synchronized (this){
                if(this.ticket>0){
                    try {
                        //通過睡眠執行緒來模擬出最後一張票的搶票場景
                        Thread.sleep(100);     
                      System.out.println(Thread.currentThread().getName()+"賣票---->"+(this.ticket--));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] arg){
        Test1 t1 = new Test1();
        new Thread(t1, "執行緒1").start();
        new Thread(t1, "執行緒2").start();
    }
}

加上synchronized
這裡寫圖片描述