簡體   English   中英

Java線程未異步運行-有些根本沒有完成

[英]Java Threads Not Running Asynchronously - Some not completing at all

我正在嘗試完成一項大學項目的實驗。 我想利用多個內核並行運行它,以便增加樣本量。 為了實現這一點,我創建了多個(最多7個,但是我嘗試使用最少2個)Java線程,並一次在所有這些線程中執行我的類。 我的電腦有8個核心。

我遇到的問題是Java在如何執行這些線程方面似乎很雜亂。 所有7個線程正常啟動。 它們異步運行了一段時間。 在一個典型的運行中,可能其中3個會在預期的時間內完成,第四個可能會在幾分鍾后完成,而最后3個根本不會完成。

實驗類設計為在一定數量的時鍾時間(而不是cpu時鍾時間)上運行。 這個因素是我無法控制的。 因此,我需要線程始終在不同的內核上同時運行。

以下代碼片段展示了我用來創建線程並將其啟動的方法。 顯然,它不是在調用我用於實驗的類,如果您復制並自己運行它,將會發現它工作正常。 我在這里提供它只是為了演示我正在正確創建和使用線程。 幾天來我一直在尋找答案,看不到我做錯了什么。

這是一個測試班,展示了我的實驗班所使用的方法。 它只是串聯一些字符串數據以確保足夠長的運行過程。

public class ThreadTestClass implements Runnable {

@Override
public void run() {
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    System.out.println("This thread is underway");
    int i=0;
    String a="a";
    while(i<25){
        a=a+a;
        i++;
    }
    System.out.println("This thread ran fine");

}

}

這就是所謂的:

   private static void ThreatTestMethod(){
    Thread[] threads = new Thread[7];
    int i=0;

    while(i<threads.length){
        threads[i] = new Thread(new ThreadTestClass());
        threads[i].start();
        i++;
    }

    while(threads[0].isAlive() || threads[1].isAlive() || threads[2].isAlive() || threads[3].isAlive() || threads[4].isAlive() || threads[5].isAlive() || threads[6].isAlive()){
        try {
            Thread.sleep(5000);
        }
        catch (InterruptedException e) {
            System.out.println("Interrupted Exception Occurred");
        }
    }

}

我的理解是Java應該自動利用所有內核,而當我執行線程時,它們應該利用所有可用的內核。 通常情況就是這樣。 我進行實驗時沒有發生。 我有什么辦法可以迫使線程在單獨的內核上同時運行?

您的示例代碼很好。

如果您的某些線程沒有返回,則它們正在阻塞(例如在read(),write(),wait()上),或者它們陷入了循環; 就像其他任何不返回的程序一樣。 附加調試器,或者只是獲取堆棧跟蹤轉儲,以了解它們在做什么。

Java API無法讓您指定如何將線程分配給核心。 它取決於實現,取決於Java實現和操作系統。

但是在實踐中,您會發現,只要您擁有相當最新的Java,線程就會在內核之間分散。

簡而言之-不。

有多種因素影響可用處理器上不同任務和線程的調度。 最明顯的可能是您正在運行的JVM,硬件和實際調度程序。 沒有簡單的方法可以強制執行此操作或保證在不同的內核上運行每個線程。

但是,可能有不同的方法使它們更有可能最終出現在不同的內核上,但是我認為您可能已經到達線程末尾。

您的字符串concat是微不足道的-幾乎沒有操作。

您的線程可能在System.Out I / O鎖上花費了大部分時間,因此根本沒有運行。

如果要啟動線程,請給他們做一些合理的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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