簡體   English   中英

多線程 java

[英]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 的建議。

看看http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.ZFC35FDC70D5FC69D269883A82C7C7A53EZ2

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

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM