1. 程式人生 > >執行緒--Thread和Runnable建立執行緒的區別

執行緒--Thread和Runnable建立執行緒的區別

建立執行緒的兩種方式:

1、繼承Thread類,並且重寫run()方法。
public class MyThread extends Thread{
       private int num=5;

       @orderride
         public void run(){
            for(int i=0;i<num;i++){                

                System.out.println("-----extends Thread---------");

}  

} public static void main(String []args){

    Thread t = new Thread();

}}

輸出結果:

-----extends Thread---------

-----extends Thread---------

-----extends Thread---------

-----extends Thread---------

-----extends Thread---------



2、實現Runnable介面,重寫run()方法。

public class MyThread implements Runnable{
       

         private int num=5;

@orderride public void run(){

            for(int i=0;i<num;i++){                

                System.out.println("------implements Runnable---------");

}

} public static void main(String []args){ MyThread a=new MyThread(); Thread t = new Thread(a); }}
輸出結果:

------implements Runnable---------

------implements Runnable---------

------implements Runnable---------

------implements Runnable---------

------implements Runnable---------




兩種建立執行緒的區別:

1、extends Thread 的話,有一個java侷限性,java是單繼承,如果一個類繼承了Thread,就不能繼承其他的類了

2、implements Runnable 的話,首先是通過實現介面實現,一個類可以實現多個介面,即這個類既然可以作為作為可以被執行緒執行的目標物件之外,還可以給這個類新增其他的類(即實現多個介面)。

3、其次通過implements Runnable還可以實現資源共享:

                    首先,Thread也是Runnable的子類
                                 
                            

                   在看下Thread 的run()方法:

                             


 可以看到當執行Thread的run方法是,呼叫的是目標物件的run方法,如果目標物件為空,則Thread本身是沒有任何意義的,

 舉 一個例子:           

public static void main(String []args){
    new MyThread().start();
    new MyThread().start();
    new MyThread().start();
}


輸出結果:會輸出15次的

-----extends Thread---------


結果分析:因為t1,t2,t3是是三個不同執行緒,三個執行緒內的num都為5,因此各自列印5次

public static void main(String []args){
    MyThread t = new MyThread();
   new Thread(t).start();
    new Thread(t).start();
    new Thread(t).start();
}


輸出結果:輸出5次

------implements Runnable---------

結果分析:因為三個執行緒呼叫的是同一個物件的run方法,因為資料時共享的。