2012-02-24 2 views
1

Я пытаюсь сделать моделирование для некоторых алгоритмов в java, теперь я сталкиваюсь с тем, что мне нужно запустить основной алгоритм 10 раз, но процесс занимает 120 минут, чтобы закончить, поэтому я выполняю каждый прогон на нитке. Я хочу создать 10 потоков, не повторяя один и тот же код в каждом потоке, так как сделать 10 разных потоков с тем же кодом, чтобы вызывать. есть идеи.Объекты Java MultiThreading

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

Насколько я понимаю, алгоритм требует интенсивного использования процессора, поэтому перед его устранением убедитесь, что у вас есть не менее 10 ядер. –

+0

10 потоков, выполняющихся 1 экземпляр алгоритма, будет занимать больше времени, чем 1 поток, выполняющий 10 экземпляров алгоритма последовательно, если только JVM не сможет воспользоваться несколькими ядрами. Не зная архитектуры вашей программы, на самом деле невозможно предложить какие-либо изменения, которые могут дать вам улучшение скорости. – 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 раз.

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, но если вы не можете начать каждый поток при его создании.

Если вам нужно хранить ссылку на резьбу, хранить их в массиве Thread

CyclicBarrier barrier = new CyclicBarrrier(10); 

// Runnable работоспособного = ... ваш код. в начале Runnable поставить первую строку барьер.await(); // и улавливать исключение

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

Вот и все! Удачи - дайте мне знать, если вам нужна помощь в реализации runnable

0

Создайте класс, который расширяет поток и реализует метод 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 потоков.

Вы можете использовать commons threadpool и установить его размер числа ядер процессора, чтобы вы могли запускать задачи параллельно и последовательно.