Java多線程開發系列之二:如何創建多線程


前文已介紹過多線程的基本知識了,比如什么是多線程,什么又是進程,為什么要使用多線程等等。

在了解了軟件開發中使用多線程的基本常識后,我們今天來聊聊如何簡單的使用多線程。

在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方法結束后,才繼續開始運行)。


免責聲明!

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



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