前文已介紹過多線程的基本知識了,比如什么是多線程,什么又是進(jìn)程,為什么要使用多線程等等。
在了解了軟件開發(fā)中使用多線程的基本常識后,我們今天來聊聊如何簡單的使用多線程。
在Java中創(chuàng)建多線程的方式有兩種:
(1)寫一個子類,這個類要繼承自Thread類,于此同時這個子類必須要重寫Thread類中的run方法(原因我后文中會提到),然后我們就可以用這個類來創(chuàng)建出一個多線程。
(2)仍然是寫一個類,這個類要實現(xiàn)Runnable接口,與(1)相同,在這個實現(xiàn)類中也需要重寫run方法。
這里有一點要注意:C#可以隨意使用任何方法,來作為一個新線程的方法,而java必須通過以上兩種途徑中的任意一種來實現(xiàn)這一個類,然后用這個類來創(chuàng)建一個新線程
使用第一種方法:繼承Thread父類
1、定義一個繼承自Thread類的子類,并且重寫run()方法,run(),這個run方法,就是未來新線程要運行的具體任務(wù)或者叫做功能。
2、實例化(new)出剛才定義的子類
3、運行這個新對象的的start方法。務(wù)必記住是start方法,只有這樣才會啟動一個新的線程。如果是運行run方法,那么仍然是簡單的單線程執(zhí)行
 1 public class FirstThread extends Thread 2 { 3     PRivate int i; 4     public void run() 5     { 6         for(;i<=100;i++) 7         { 8             System.out.println(getName()); 9         }10     }11     public static void main(String[] args)12     {13         for(int i=0;i<100;i++)14         {15             if(i%10==0)16             {17                 new FrirstThread.start();18                 new FrirstThread.start();19             }20         }21     } 22 }使用第二種方法:通過實現(xiàn)Runnable接口,來開辟新線程
1、定義一個類,這個類需要實現(xiàn)Runnable接口,仍然需要在該類中重寫接口中的run方法,與方法1一樣,這個run方法也是未來的線程執(zhí)行體
2、實例化(new)出剛才定義的類A(防盜連接:本文首發(fā)自王若伊_恩賜解脫http://m.survivalescaperooms.com/jilodream/ )
3、實例化(new)出一個Thread類,并以A作為target,運行start方法
 1 public class SecondThread implements Runnable 2 { 3     private int i; 4     public void run() 5     { 6         for(;i<=100;i++) 7         { 8             System.out.println(Thread.currentThread().getName()); 9         }10     }11     public static void main(String[] args)12     {13         for(int i=0;i<100;i++)14         {15             if(i%10==0)16             {17                 SecondThread st=new SecondThread()18                 new Thread(st,"name1").start();19                 new Thread(st,"name2").start();20             }21         }22     } 23 }兩種開辟多線程方式的比較
1、在繼承方面:由于java 不允許多重繼承,所以如果存在某個基類的需要繼承情況下,方法1(使用Thread子類)的方式明顯要比方法二(實現(xiàn)Runnable接口的)的方式要麻煩(因為方法2還可以再繼承一個父類)
2、共享數(shù)據(jù)方面:方法2可以直接以新定義的類作為各個線程對象(Thread實例)的target,這樣各個線程對象的target對象可以說是共享的,大家可以共同處理同一份資源(放在target中),而方法一則需要另外再寫方法,或者修改構(gòu)造函數(shù)
3、方法1比方法2要簡單的多,也更容易理解(我是這樣感覺的)。在run方法中,如果需要使用當(dāng)前線程對象的方法(如getName,setName)或字段,方法一可以直接使用(因為它本身就是正在執(zhí)行的線程對象),而方法二則需要使用Thread.CurrentThread()方法來獲取當(dāng)前執(zhí)行的線程對象(因為正在運行這個方法,所以當(dāng)前線程對象即為運行這個方法的線程對象(有點拗口),有點繞的味道),然后調(diào)用當(dāng)前線程對象的方法。
4、無論是哪種方法開辟多線程,都請不要忘記,除了開辟和運行新線程,本身還存在一個正在執(zhí)行的線程(兩個例子中都是Main 線程)
5、無論是哪種方法,如果要使用新線程執(zhí)行方法體,都需要使用start 方法來被動的運行 run,而不能直接運行run方法(此時就是一個簡單的順序結(jié)構(gòu),主線程會等到run方法結(jié)束后,才繼續(xù)開始運行)。
新聞熱點
疑難解答