前文已介紹過多線程的基本知識了,比如什么是多線程,什么又是進程,為什么要使用多線程等等。
在了解了軟件開發中使用多線程的基本常識后,我們今天來聊聊如何簡單的使用多線程。
在Java中創建多線程的方式有兩種:
(1)寫一個子類,這個類要繼承自Thread類,於此同時這個子類必須要重寫Thread類中的run方法(原因我后文中會提到),然后我們就可以用這個類來創建出一個多線程。
(2)仍然是寫一個類,這個類要實現Runnable接口,與(1)相同,在這個實現類中也需要重寫run方法。
這里有一點要注意:C#可以隨意使用任何方法,來作為一個新線程的方法,而java必須通過以上兩種途徑中的任意一種來實現這一個類,然后用這個類來創建一個新線程
使用第一種方法:繼承Thread父類
1、定義一個繼承自Thread類的子類,並且重寫run()方法,run(),這個run方法,就是未來新線程要運行的具體任務或者叫做功能。
2、實例化(new)出剛才定義的子類
3、運行這個新對象的的start方法。務必記住是start方法,只有這樣才會啟動一個新的線程。如果是運行run方法,那么仍然是簡單的單線程執行
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 }
使用第二種方法:通過實現Runnable接口,來開辟新線程
1、定義一個類,這個類需要實現Runnable接口,仍然需要在該類中重寫接口中的run方法,與方法1一樣,這個run方法也是未來的線程執行體
2、實例化(new)出剛才定義的類A(防盜連接:本文首發自王若伊_恩賜解脫http://www.cnblogs.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子類)的方式明顯要比方法二(實現Runnable接口的)的方式要麻煩(因為方法2還可以再繼承一個父類)
2、共享數據方面:方法2可以直接以新定義的類作為各個線程對象(Thread實例)的target,這樣各個線程對象的target對象可以說是共享的,大家可以共同處理同一份資源(放在target中),而方法一則需要另外再寫方法,或者修改構造函數
3、方法1比方法2要簡單的多,也更容易理解(我是這樣感覺的)。在run方法中,如果需要使用當前線程對象的方法(如getName,setName)或字段,方法一可以直接使用(因為它本身就是正在執行的線程對象),而方法二則需要使用Thread.CurrentThread()方法來獲取當前執行的線程對象(因為正在運行這個方法,所以當前線程對象即為運行這個方法的線程對象(有點拗口),有點繞的味道),然后調用當前線程對象的方法。
4、無論是哪種方法開辟多線程,都請不要忘記,除了開辟和運行新線程,本身還存在一個正在執行的線程(兩個例子中都是Main 線程)
5、無論是哪種方法,如果要使用新線程執行方法體,都需要使用start 方法來被動的運行 run,而不能直接運行run方法(此時就是一個簡單的順序結構,主線程會等到run方法結束后,才繼續開始運行)。