2012-02-24 82 views
1

我想在java中對一些算法進行建模,現在我所面臨的是我需要運行10次算法的主要過程,但過程需要120分鐘才能完成,因此我正在執行每次運行在一個線程上。我想要的是創建10個線程,而不必在每個線程中重複相同的代碼,以便如何使用相同的代碼執行10個不同的線程執行。有任何想法嗎。Java多線程對象

package biodavidcorne; 

import java.util.Random; 

/** 
* 
* @author hyder 
*/ 
public class BIODavidCorne extends Thread { 

public void run(int Runs) { 
} 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 


    BIODavidCorne test = new BIODavidCorne(); 
    Thread t1 = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      try { 
       int Runs = 0; 
       int[][] Mean10Runs = new int[10][10000]; 
       int[][] Min10Runs = new int[10][10000]; 
       int[][] Max10Runs = new int[10][10000]; 




       // for (int Runs = 0; Runs < 10; Runs++) { 
       BinList test = new BinList(); 
       Random generator = new Random(); 
       for (int i = 0; i < 10; i++) { 
        test.ReadLine("File.txt", i); 
       } 

       //test.PrintListOfGarbage(); 
       for (int i = 0; i < 10; i++) { 
        test.InsertGarbageToBin(i); 
       } 
       for (int Big = 0; Big < 10000; Big++) { 
        int Mean = 0; 
        for (int x = 0; x < 10; x++) { 
         for (int i = 0; i < 50; i++) { 
          test.GetPenalties(x, i); 
         } 
        } 
        //  System.out.println("*******************************************************************************************" + Big + " .. " + Runs); 
        // test.PrintListOfGarbage(); 
        int[] penalty = new int[10]; 
        int[] minimum = new int[10]; 
        int[] maximum = new int[10]; 
        int[] mutation = new int[10]; 
        // test.PrintListOfGarbage(); 
        for (int i = 0; i < 10; i++) { 
         penalty[i] = test.getAllPanalties(i); 
        } 

        for (int i = 0; i < 10; i++) { 
         minimum[i] = test.getMinimum(i); 
         maximum[i] = test.getMaximum(i); 
         mutation[i] = test.calculateMutation(penalty[i], minimum[i], maximum[i]); 
         // 

        } 

        int r = generator.nextInt(10); 
        int s = generator.nextInt(10); 
        test.MakeTheFitness(mutation, r, s); 
        test.resetPenaltyArray(); 
        // test.PrintListOfGarbage(); 
        for (int i = 0; i < 10; i++) { 
         Mean = Mean + mutation[i]; 

        } 
        int min = mutation[0]; 
        int max = 0; 
        for (int i = 0; i < 10; i++) { 

         if (min > mutation[i]) { 
          min = mutation[i]; 
         } 
         if (max < mutation[i]) { 
          max = mutation[i]; 
         } 
        } 
        Min10Runs[Runs][Big] = min; 
        Max10Runs[Runs][Big] = max; 
        Mean10Runs[Runs][Big] = (Mean/10); 
        System.out.println("This is the Mean 1"+Big+".."+Runs); 

       } 

       System.out.println("This is the Mean + for Runs" + Runs + ".. " + Mean10Runs[Runs][9999] + "This is the Minimum " + Min10Runs[Runs][9999]); 


      } catch (Exception e) { 
       System.out.println("Not supported yet." + e); 
      } 

     } 
    }); 
    Thread t2 = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      try { 
       int Runs = 0; 
       int[][] Mean10Runs = new int[10][10000]; 
       int[][] Min10Runs = new int[10][10000]; 
       int[][] Max10Runs = new int[10][10000]; 




       // for (int Runs = 0; Runs < 10; Runs++) { 
       BinList test = new BinList(); 
       Random generator = new Random(); 
       for (int i = 0; i < 10; i++) { 
        test.ReadLine("File.txt", i); 
       } 

       //test.PrintListOfGarbage(); 
       for (int i = 0; i < 10; i++) { 
        test.InsertGarbageToBin(i); 
       } 
       for (int Big = 0; Big < 10000; Big++) { 
        int Mean = 0; 
        for (int x = 0; x < 10; x++) { 
         for (int i = 0; i < 50; i++) { 
          test.GetPenalties(x, i); 
         } 
        } 
        // System.out.println("*******************************************************************************************" + Big + " .. " + Runs); 
        // test.PrintListOfGarbage(); 
        int[] penalty = new int[10]; 
        int[] minimum = new int[10]; 
        int[] maximum = new int[10]; 
        int[] mutation = new int[10]; 
        // test.PrintListOfGarbage(); 
        for (int i = 0; i < 10; i++) { 
         penalty[i] = test.getAllPanalties(i); 
        } 

        for (int i = 0; i < 10; i++) { 
         minimum[i] = test.getMinimum(i); 
         maximum[i] = test.getMaximum(i); 
         mutation[i] = test.calculateMutation(penalty[i], minimum[i], maximum[i]); 
         // 

        } 

        int r = generator.nextInt(10); 
        int s = generator.nextInt(10); 
        test.MakeTheFitness(mutation, r, s); 
        test.resetPenaltyArray(); 
        // test.PrintListOfGarbage(); 
        for (int i = 0; i < 10; i++) { 
         Mean = Mean + mutation[i]; 

        } 
        int min = mutation[0]; 
        int max = 0; 
        for (int i = 0; i < 10; i++) { 

         if (min > mutation[i]) { 
          min = mutation[i]; 
         } 
         if (max < mutation[i]) { 
          max = mutation[i]; 
         } 
        } 
        Min10Runs[Runs][Big] = min; 
        Max10Runs[Runs][Big] = max; 
        Mean10Runs[Runs][Big] = (Mean/10); 
        System.out.println("This is the Mean 2"+Big+".."+Runs); 

       } 



      } catch (Exception e) { 
       System.out.println("Not supported yet." + e); 
      } 

     } 
    }); 
    t1.start(); 
    t2.start(); 
} 

}

+3

就我所見,你的算法是CPU密集型的,所以在解決這個問題之前,確保你至少有10個內核可用。 – 2012-02-24 14:07:45

+0

10個線程運行算法的1個實例是要花費更多的時間比運行算法依次的10個實例1個線程,除非JVM能夠採取的多個核的優點。如果不知道程序的體系結構,就不可能建議可能會提高速度的任何更改。 – mcfinnigan 2012-02-24 14:11:00

+0

我會將內存分配移出內部循環,例如在for循環之外聲明懲罰,最小值,最大值等,並在每次迭代開始時將它們置零。這可能會加速串行或線程代碼。 – andrewmu 2012-02-24 14:12:47

回答

4

只是使Runnable命名類,而不是一個匿名內部類,並重新使用它:

class MyRunnable implements Runnable { 
    @Override 
    public void run() { 
     int Runs = 0; 
     int[][] Mean10Runs = new int[10][10000]; 
    // ... 

new Thread(new MyRunnable()).start(); 

你可以(也應該)把MyRunnable其自己的源文件。

1

沒有理由複製和粘貼匿名內部類的內容十次。只需將其分配給一個變量並使用它10次。

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     // ... the code in the anonymous inner class 
    } 
} 

// Start 10 threads with this code 
for (int i = 0; i < 10; ++i) { 
    new Thread(runnable).start(); 
} 
1

您可以使用一個for循環來創建線程。另外,如果你想確保所有的線程同時啓動,你可以使用CyclicBarrier,但是如果沒有,你可以在創建它的時候啓動每個線程。

如果需要保存對線程的引用,將它們存儲在一個線程陣列

CyclicBarrier barrier = new CyclicBarrrier(10); 

// Runnable接口可運行= ...你的代碼。在Runnable開始處放置第一行 barrier.await(); //並捕獲異常

Thread[] threads = new Thread[10]; 
for(int i = 0; i < 10; i++){ 
    threads[i] = new Thread(runnable); 
    threads[i].start(); 
} 

這就是它!祝你好運 - 讓我知道如果你需要幫助實現可運行

0

創建一個擴展Thread並實現run方法的類。您可以通過構造函數傳遞參數,並將它們保存爲run()方法中使用它們的成員。

事情是這樣的:

public class YourThread extends Thread{ 

    private String mParam1; 
    private Object mParam2; 

    public YourThread(String param1, Object param2){ 
     mParam1 = param1; 
     mParam2 = param2; 
    } 

    public void run(){ 
     // do your stuff here 
     // ... 
    } 

} 

在其他類:

YourThread t1 = new Thread("toto", new Object()); 
t1.start(); 

YourThread t2 = new Thread("titi", new Object()); 
t2.start(); 
1

除非你有10個CPU內核不產卵10個線程。

您可以使用commons threadpool並設置CPU的核心數量的大小,這樣你就可以在並行和順序執行的任務。