2011-11-22 39 views
1

我有一個類,它實現Runnable接口。我想創建該類多線程,我發現兩種方法用於創建多線程:在java中創建Multithread的正確方法?

class MyRunnable implements Runnable { 
     public void run() { 
      System.out.println("Important job running in MyRunnable"); 
    } 
    } 

1.首先方法:

public class TestThreads { 
    public static void main (String [] args) { 
    MyRunnable r = new MyRunnable(); 
    Thread foo = new Thread(r); 
    Thread bar = new Thread(r); 
    Thread bat = new Thread(r); 
    foo.start(); 
    bar.start(); 
    bat.start(); 
    } 
    } 

2.second方法:

public class TestThreads 
{ 
public static void main (String [] args) 
{ 
Thread[] worker=new Thread[3]; 
MyRunnable[] r = new MyRunnable[3]; 

for(int i=0;i<3;i++) 
{ 
    r[i] = new MyRunnable(); 
    worker[i]=new Thread(r[i]); 
    worker[i].start(); 

} 
} 
} 

哪一個是最好的使用方法,兩者有什麼區別?

Regards

+2

如果Runnable沒有狀態(無實例變量),則不需要Runnable的三個實例。除此之外,使用ExecutorService,不要創建自己的線程。 – Thilo

回答

2

在你的例子中,runnable沒有實例狀態,所以你不需要它的多個實例。

否則我更喜歡第二種方法,因爲每當你切割一行代碼時,一個循環通常是更好的主意。

通常,您應該等待您開始的線程。

public class TestThreads { 
    public static void main (String [] args) { 
     Thread[] worker=new Thread[3]; 
     Runnable r = new MyRunnable(); 

     for(int i=0;i<3;i++) { 
      worker[i]=new Thread(r); 
      worker[i].start(); 
     } 

     for(int i=0;i<3;i++) { 
      worker[i].join(); 
      worker[i] = null; 
     } 
    } 

}

下一步然後將使用Java 5+的ExecutorService。你不需要並且需要在現代Java中管理你自己的線程。

int poolSize = 3; 
int jobCount = 3; 
Runnable r = new MyRunnable() 
ExecutorService pool = Executors.newFixedThreadPool(poolSize); 
for (int i = 0; i < jobCount; i++) { 
    pool.execute(r); 
} 
pool.shutdown(); 
+0

我沒有太多的多線程編程經驗。到現在爲止,如果我必須運行多個線程,我使用第二種方法,但不使用ExecutorService。我不太瞭解使用它的優點/缺點。請,你能解釋我嗎? –

+2

@AlbertoSolano ExecutorService允許您重用線程池,而不是爲每個可運行的程序創建新的線程。 – tanyehzheng

0

唯一不同的是第一個只有一個運行3次的「MyRunnable」副本。第二種方法每個線程都有自己的MyRunnable副本。在這種情況下,

0

那麼這兩種方法中的每一個都不是問題都有自己的用途:

  1. ,如果你有幾個不同的任務並行不使用同一個執行第一種方法是有用可運行的界面(即下載一個網頁,同時處理一些XML)。當然,這在您的示例中不可見,因爲您使用的是相同的界面。
  2. 第二種方法是當你想用多個線程(也就是主從線程模式,主線程產生一組線程來處理相同的事情,然後在屏障上加入它們)處理相同的事情。
相關問題