2014-10-27 74 views
0

我能正確實現這些Java線程嗎?目標是有十個併發線程計算從1到(上限22 + i)的總和。我試圖確定名稱並在運行線程時將其打印出來,然後在線程退出時打印結果。目前,我將所有結果以隨機順序同時打印出來,並且我不確定在線程開始和結束時是否正確獲取信息。簡單的併發Java線程 - 捕獲開始和結束

public class threads { 
    public static void main(String[] args) { 
    for(int i = 0; i < 10; i++) { 
     final int iCopy = i; 
     new Thread("" + i) { 
     public void run() { 
      int sum = 0; 
      int upperBound = 22; 
      int lowerBound = 1; 
      long threadID = Thread.currentThread().getId(); 

      for (int number = lowerBound; number <= upperBound; number++){ 
      sum = sum + number + iCopy; 

      } 
      System.out.println(threadID + " thread is running now, I and will compute the sum from 1 to " + (upperBound + iCopy) + ". The i is : " + iCopy); 
      System.out.println("Thread id #" + threadID + ", the "+ sum + " is done by the thread."); 
     } 

     }.start(); 
    } 
    } 
} 
+0

不應該從'lowerBound'運行到'upperBound + iCopy',而'sum'應該只是'sum = sum + number'? – isnot2bad 2014-10-27 08:41:36

回答

0

線程運行的順序將完全取決於正在使用的JVM和底層資源。

如果您有幾個可用的內核(cpus),則您的代碼可能與單個內核完全不同。

本質上,您的主循環在單個線程中運行到最後,引發10個新線程,並將啓動方法放入進程隊列中。其他處理器可能開始運行這些線程。每個額外的線程會導致不同的總負載,因此它們在每個處理器上運行方式略有不同(性能明智),這意味着它們運行得更快/更慢,並在不同時間結束。

你的代碼證明了這一點。

2

我已經執行了你的代碼,並觀察到所有線程在這種情況下正常運行10。由於線程以隨機順序調用,這就是爲什麼可能會看到這種行爲,但我確信所有線程都可以正常運行並執行所需的功能。

任何如何在輸出我看到,在for循環中的值應該從0開始到9,但這裏即使這是隨機的,可能是因爲一些線程正在休眠,同時執行並讓位給其他線程。

希望這會有所幫助 謝謝。

+0

因此線程正確運行,打印語句也正確放置?意思是,打印線程在啓動時正在運行,然後在退出時打印總和? – user25976 2014-10-27 05:16:20

+0

準確地說,您可以在代碼塊的開頭打印循環計數器並檢查,由於您在線程結束時打印,因此您會看到此行爲。 – 2014-10-27 05:20:23