2011-07-21 50 views
3

我想弄清楚如何在java中多線程。現在,我的程序運行正常,沒有併發性,但我想實現多線程來幫助加快速度。多線程java

該程序運行一個單獨的子類的幾個對象,每個這些對象的50%的時間評估花費在一個只使用一個內核而不是8個可用內核的進程中。這些對象直到彼此完全獨立,但在程序中用作輸入。

我想通過讓子類實現Runnable來讓它多線程化,然後讓我的程序爲每個這樣的對象使用一個線程。這是否是正確的方法?

但是,java中的線程如何處理?我需要在每次運行後處理線程嗎?如何加入工作?

謝謝

+2

如果你寫了一個重要的應用程序,你應該看看理論:http://download.oracle.com/javase/tutorial/essential/concurrency/。否則,你會很難學會它:-) – home

回答

5

你幾乎走上正軌。您將創建一個Thread對象

Runnable r = new MyClassImplementingRunnable(); 
Thread t = new Thread(p); 
t.start(); 
t.join(); // wait for thread to die 

線程對象是收集像任何其他對象的,垃圾,run方法完成時線程本身死亡。關鍵是你的Runnable的運行方法確實必須保證返回,你的設計不能依賴於能夠從外部殺死線程。

如果您要有很多線程,您需要等待它們全部完成,因此您可以保留已開始線程的集合,然後使用t.join(smallNumberOfMillis)來查看哪些他們已經完成了。這有點低效,所以還有其他技術可以讓線程相互通信,我建議讀取this article

@denis還提到Executor和相關類提供了一個更好的線程上面的抽象。如果您對學習背景有興趣,那麼手動管理線程很有趣。如果你只是想完成這項工作,請按照Denis的建議。

+0

不會主動管理線程:) –

+0

好的,這是他首先學習底層細節還是使用更好的抽象。 – djna

+0

如何在子類中設置run方法?現在我得到一個拋出的空指針異常錯誤 – randomafk

7

不要手動管理線程,在Java

+0

我會稍後再研究它,但我想先了解一下hte基礎知識 – randomafk

+1

@randomafk:這些*都是基礎知識。 –

3

看看executors and thread pools看看http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html

構造函數你想要的線程數。在這種情況下,核心數量相同。

ScheduledThreadPoolExecutor s = new ScheduledThreadPoolExecutor(8); 
List<Future> futures = new ArrayList<Future>(); 
foreach(...something...) 
    futures.add(s.submit(new MyCallable())); 
foreach(Future f : futures) 
    f.get(); // Result of computation 
System.out.println("Done"); 
+0

MyCallable類是否需要像Runnable一樣具有特殊的運行功能? – randomafk

+0

是可調用類似於Runnable,除了定義爲接口可調用 {V call(); }所以他們可以返回你喜歡的類型的對象。 http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/Callable.html –

0

這是啓動多線程的好方法。

public class ThreadExample { 
    public static void main(String[] args) { 
     //Main thread 
     System.out.println("Main thread"); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       //This thread is independent of the main thread 
       System.out.println("Inner Thread"); 
      } 
     }).start(); 
    } 
}