Java MultiThreading объекты - PullRequest
       0

Java MultiThreading объекты

1 голос
/ 24 февраля 2012

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

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();
}

}

Ответы [ 6 ]

4 голосов
/ 24 февраля 2012

Просто сделайте 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 голос
/ 24 февраля 2012

Если у вас нет 10 процессорных ядер, не порождает 10 потоков.

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

1 голос
/ 24 февраля 2012

Вы можете использовать цикл for для создания потоков. Кроме того, если вы хотите, чтобы все потоки запускались одновременно, вы можете использовать CyclicBarrier, но если нет, вы можете просто запустить каждый поток при его создании.

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

CyclicBarrier barrier = new CyclicBarrrier(10);

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

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

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

1 голос
/ 24 февраля 2012

Нет смысла копировать и вставлять содержимое анонимного внутреннего класса десять раз.Просто назначьте его переменной и используйте его 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();
}
0 голосов
/ 24 февраля 2012

Создайте класс, расширяющий 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();
0 голосов
/ 24 февраля 2012

попробуйте использовать ThreadPoolExecutor

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...