[英]Multithreading java
我試圖弄清楚如何在 java 中進行多線程處理。 現在,我的程序在沒有並發的情況下運行良好,但我想實現多線程來幫助加快它的速度。
該程序運行一個單獨的子 class 的多個對象,並且每個對象的 50% 的評估時間都花在一個僅使用一個內核而不是 8 個可用內核的進程中。 這些對象在程序中用作輸入之前是完全相互獨立的。
我試圖通過讓子類實現 Runnable 來實現多線程,然后讓我的程序為每個這樣的 object 使用一個線程。 這是正確的方法嗎?
但是,如何處理 java 中的線程? 每次運行后我需要處理線程嗎? 加入如何運作?
謝謝
不要手動管理線程,看看java中的執行器和線程池
你幾乎步入正軌。 您將創建一個線程 object
Runnable r = new MyClassImplementingRunnable();
Thread t = new Thread(p);
t.start();
t.join(); // wait for thread to die
線程 object 像任何其他 object 一樣被垃圾收集,當 run 方法完成時線程本身就會死亡。 關鍵是你的 Runnable 的 run 方法確實必須保證返回,你的設計不能依賴於能夠從外部殺死線程。
如果您將擁有大量線程,則需要等待它們全部完成,因此您可以保留已啟動線程的集合,然后使用 t.join(smallNumberOfMillis) 查看其中哪些已完成。 這有點低效,所以還有其他允許線程相互通信的技術,我建議閱讀這篇關於它們的文章。
@denis 還提到 Executor 和相關類在線程之上提供了更好的抽象。 如果您有興趣了解背景知識,那么手動管理 Threads 會很有趣。 如果您只想完成工作,請遵循 Denis 的建議。
構造函數采用您想要的線程數。 在這種情況下,與您的核心數量相同。
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");
這是開始多線程的好方法。
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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.