我想弄清楚如何在java中多線程。現在,我的程序運行正常,沒有併發性,但我想實現多線程來幫助加快速度。多線程java
該程序運行一個單獨的子類的幾個對象,每個這些對象的50%的時間評估花費在一個只使用一個內核而不是8個可用內核的進程中。這些對象直到彼此完全獨立,但在程序中用作輸入。
我想通過讓子類實現Runnable來讓它多線程化,然後讓我的程序爲每個這樣的對象使用一個線程。這是否是正確的方法?
但是,java中的線程如何處理?我需要在每次運行後處理線程嗎?如何加入工作?
謝謝
我想弄清楚如何在java中多線程。現在,我的程序運行正常,沒有併發性,但我想實現多線程來幫助加快速度。多線程java
該程序運行一個單獨的子類的幾個對象,每個這些對象的50%的時間評估花費在一個只使用一個內核而不是8個可用內核的進程中。這些對象直到彼此完全獨立,但在程序中用作輸入。
我想通過讓子類實現Runnable來讓它多線程化,然後讓我的程序爲每個這樣的對象使用一個線程。這是否是正確的方法?
但是,java中的線程如何處理?我需要在每次運行後處理線程嗎?如何加入工作?
謝謝
你幾乎走上正軌。您將創建一個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的建議。
看看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");
MyCallable類是否需要像Runnable一樣具有特殊的運行功能? – randomafk
是可調用類似於Runnable,除了定義爲接口可調用
這是啓動多線程的好方法。
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();
}
}
如果你寫了一個重要的應用程序,你應該看看理論:http://download.oracle.com/javase/tutorial/essential/concurrency/。否則,你會很難學會它:-) – home