2011-01-20 56 views
1

我在做一個科學公平的項目,在這個項目中我測試了多少額外的處理內核提高了計算速度。這是我迄今編程的多核基準,但存在問題。 「thread#.join();」行都拋出錯誤。有人可以解決這個問題嗎?請記住,我是初學者,所以你可以用非常簡單的術語解釋如何解決問題,或者通過將修復後的代碼放入你的回答中展示給我。這裏是我有:Java中的多線程基準測試

import java.util.Calendar; 
import java.text.SimpleDateFormat; 
import java.util.Scanner; 
import java.text.*; 
import java.util.concurrent.*; 

public class SciFair 
{ 

    /** 
    * Numa Robertson 
    * 1/13/11 
    * Science Fair 2011 
    */ 

    public static String now(String dateFormat) { 
     Calendar cal = Calendar.getInstance(); 
     SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); 
     return sdf.format(cal.getTime()); 
    } 

    public static void main(String[] args) { 
     Scanner dataIn = new Scanner(System.in); 
     DecimalFormat timeInSeconds = new DecimalFormat("##.###"); 

     System.out.println("Are you ready to begin the benchmark? "); 
     String response = dataIn.nextLine(); 
     double endNum = 0; 

     if(response.equals("Yes") || response.equals("yes") || response.equals("Ok") || response.equals("ok")) { 

      System.out.println("Benchmark starting at " + SciFair.now("H:mm:ss:SSS") + "."); 

      String startTimeHours = SciFair.now("H"); 
      String startTimeMinutes = SciFair.now("mm"); 
      String startTimeSeconds = SciFair.now("ss"); 
      String startTimeMilliseconds = SciFair.now("SSS"); 
      double startTimeHoursNumFormat = Double.valueOf(startTimeHours.trim()).doubleValue(); 
      double startTimeMinutesNumFormat = Double.valueOf(startTimeMinutes.trim()).doubleValue(); 
      double startTimeSecondsNumFormat = Double.valueOf(startTimeSeconds.trim()).doubleValue(); 
      double startTimeMillisecondsNumFormat = Double.valueOf(startTimeMilliseconds.trim()).doubleValue(); 
      double startHoursInSeconds = (startTimeHoursNumFormat * 3600); 
      double startMinutesInSeconds = (startTimeMinutesNumFormat * 60); 
      double startMillisecondsInSeconds = (startTimeMillisecondsNumFormat/1000); 
      double startTotalSeconds = (startHoursInSeconds + startMinutesInSeconds + startTimeSecondsNumFormat + startMillisecondsInSeconds); 

      Thread thread1 = new Thread() { 
       public void run() { 
        double endNum = 0; 
        double num = 5832544225416546445465465465465465448412168546725.2655236355335649499923164684654345649874181221173246189579162421579584572121334216957951462175918894199993642446445548521652158975; 

        for(double numberRun = 0; numberRun <= 1666666660; numberRun++) { 
         endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156/321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181/111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521/31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544/32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664)/2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);  
        } 
       } 
      }; 


      Thread thread2 = new Thread() { 
       public void run() { 
        double endNum = 0; 
        double num = 5832544225416546445465465465465465448412168546725.2655236355335649499923164684654345649874181221173246189579162421579584572121334216957951462175918894199993642446445548521652158975; 

        for(double numberRun = 0; numberRun <= 1666666660; numberRun++) { 
         endNum = endNum+((num * 58445246411658545558.458561435435385465146445641894984984651321616548946132131654984 + 26564.6351648941654984156/321654984616321654654984365.3216548974165416484 + 216541648165141654.23164584961321316546844651 * 65616484316541486541.1654484646546576746862468546576248645814668585145181/111.3216516543464545795479884754424759845 * 3467247954975472171276545789595.4721756147541715715157145715145714514748717521/31654688498445132154.3215449848489461531654 * 61654984132165465484464131321145644684.3164846434654648446546546465456465465414321165118547521569845258547566352544/32136546465434654654484843131.3164484151515121211554464547951126758178571454164175415417584175664)/2431276251975915431326725157958456157321624621765419.4321672175951247316726451751487465462645754579517232172757497516373127651975167516715);  
        } 
       } 
      }; 

      //Snip out a bunch of copy/paste thread implementations 



      thread1.start(); 
      thread2.start(); 
      thread3.start(); 
      thread4.start(); 
      thread5.start(); 
      thread6.start(); 

      thread1.join(); 
      thread2.join(); 
      thread3.join(); 
      thread4.join(); 
      thread5.join(); 
      thread6.join(); 


      String endTimeHours = SciFair.now("H"); 
      String endTimeMinutes = SciFair.now("mm"); 
      String endTimeSeconds = SciFair.now("ss"); 
      String endTimeMilliseconds = SciFair.now("SSS"); 
      double endTimeHoursNumFormat = Double.valueOf(endTimeHours.trim()).doubleValue(); 
      double endTimeMinutesNumFormat = Double.valueOf(endTimeMinutes.trim()).doubleValue(); 
      double endTimeSecondsNumFormat = Double.valueOf(endTimeSeconds.trim()).doubleValue(); 
      double endTimeMillisecondsNumFormat = Double.valueOf(endTimeMilliseconds.trim()).doubleValue(); 
      double endHoursInSeconds = (endTimeHoursNumFormat * 3600); 
      double endMinutesInSeconds = (endTimeMinutesNumFormat * 60); 
      double endMillisecondsInSeconds = (endTimeMillisecondsNumFormat/1000); 
      double endTotalSeconds = (endHoursInSeconds + endMinutesInSeconds + endTimeSecondsNumFormat + endMillisecondsInSeconds); 

      double elapsedTime = (endTotalSeconds - startTotalSeconds); 

      System.out.println("\nThe benchmark is complete at " + SciFair.now("H:mm:ss:SSS") + ", and the end result is " + endNum + "."); 
      System.out.println("\nThe benchmark was run in " + timeInSeconds.format(elapsedTime) + " seconds."); 
     } else { 
      System.out.println("\nPlease restart the program when you are ready to benchmark."); 
     } 
    } 
} 
+0

告訴我們錯誤是什麼讓我們找到一個答案很長的路要走! – Affe 2011-01-20 00:18:55

回答

1

問題是,線程#join()拋出檢查異常,編譯器希望你處理該異常。檢查異常通常通過聲明您的方法/函數可以拋出異常或捕獲異常來處理。

在您的具體情況中,由於您只是在編寫簡單的基準測試應用程序,因此最簡單的解決方案就是指出您的代碼可能會拋出異常。

public static void main(String[] args) throws InterruptedException { 

的處理異常的一個例子是這樣的:

try { 
    thread1.join(); 
    thread2.join(); 
    thread3.join(); 
    thread4.join(); 
    thread5.join(); 
    thread6.join(); 
} catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); //This is a best practice for handling the InterruptedException only 
    logger.log("The thread has been interrupted and should now exit quickly and cleanly. Processing may be incomplete."); 
} 
0

我建議你使用的ExecutorService。我希望你會看到它讓管理線程變得更容易。

public static void main(String[] args) throws InterruptedException { 
int threads = 6; 

System.out.println("Benchmark starting at " + new Date()); 
long start = System.nanoTime(); 
ExecutorService es = Executors.newCachedThreadPool(); 
for (int i = 0; i < threads; i++) 
    es.submit(new Runnable() { 
     public void run() { 
      // place your benchmark code here 
     } 
    }); 
es.shutdown(); 
es.awaitTermination(60, TimeUnit.SECONDS); 
long time = System.nanoTime() - start; 

System.out.printf("%nThe benchmark is complete at " + new Date() + "%nThe benchmark was run in %.3f seconds.%n", time/1e9); 
} 

我假設你編譯錯誤是,你不處理InterruptedException的。沒有必要捕獲InterruptedException作爲a)它不應該發生b)你不能做任何事,只能記錄它。