2012-02-24 19 views
1

私はJavaでいくつかのアルゴリズムのモデリングをしようとしていますが、私は現在、アルゴリズムのメインを10回実行する必要がありますが、処理は120分かかるため、スレッド上で私が望むのは、各スレッドで同じコードを繰り返さずに10個のスレッドを作成し、同じコードで10個の異なるスレッドを実行する方法です。何か案は。Java MultiThreading objects

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個のコアがあることを確認してください。 –

+0

10スレッドの実行アルゴリズムの1インスタンスは、JVMが複数のコアを利用できない限り、アルゴリズムの10インスタンスを順次実行する1スレッドより多くの時間がかかります。あなたのプログラムのアーキテクチャーを知らなくても、スピードの向上をもたらす可能性のある変更を提案することは本当に可能ではありません。 – mcfinnigan

+0

私は内部ループからメモリ割り当てを移動したいと思います。ペナルティ、最小値、最大値などをforループの外側に宣言し、各繰り返しの開始時にそれらをゼロにします。おそらく、シリアルまたはスレッド化されたコードがスピードアップします。 – andrewmu

答えて

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回コピーして貼り付ける理由はありません。それを変数に代入し、それを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

を使用してみてください。 また、すべてのスレッドが同時にキックオフされるようにするには、サイクリック・バリアーを使用できますが、そうでない場合は、作成するたびに各スレッドを開始することができます。

あなたがスレッドへの参照を保持する必要がある場合は、スレッドの配列

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個のスレッドを生成していない10個のCPUコアを持っていない限り。

commons threadpoolを使用してCPUコア数のサイズを設定すると、タスクを並行して順番に実行できます。