Problemas de múltiples hilos de Mergesort

Estoy tratando de escribir un mergesort de subprocesos múltiples y estoy teniendo lo que para mí son problemas muy confusos. No conozco completamente las reglas de cómo los hilos comparten / usan variables ...

Por ejemplo, si dentro de una clase ejecutable, creo otra instancia de ese Runnable y le paso una de mis matrices como parámetro, ¿se transfieren las ediciones de esa clase? Parece como si lo hicieran, pero también parece que estoy teniendo un comportamiento inesperado.

Aquí está mi código:

public class PSort implements Runnable {

private int [] Arr;
private int begin;
private int end;

public void run () {
    // Base Case - Insertion sort
    if(this.end-this.begin <= 10) {
        InsertionSort();
    }
    else {
        int left_start  = this.begin;
        int left_end    = this.begin + (this.end-this.begin)/2;
        int right_start = this.begin + (this.end-this.begin)/2 + 1;
        int right_end   = this.end;


        Thread t1 = new Thread(new PSort(this.Arr, left_start, left_end));
        Thread t2 = new Thread(new PSort(this.Arr, right_start, right_end));
        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();

            merge(left_start, left_end, right_start, right_end);
        } catch (Exception e) {}
    }
}

public PSort (int[] A, int begin, int end) {
    this.Arr = A;
    this.begin = begin;
    this.end = end;
    System.out.println("New thread: " + this.begin + " " + this.end);
}

public static void ParallelSort (int[] A, int begin, int end) {

    PSort psort = new PSort(A, begin, end);
    Thread thread = new Thread(psort);

    thread.start();

    try {
        thread.join();
        psort.printArray();
    } catch (InterruptedException e) {}
}

public void printArray() {
    int count = 0;
    for(int x = this.begin; x < this.end; x++) {
        if(count < 10) {
            System.out.print(Arr[x] + " ");
            count++;
        }
        else {
            count = 1;
            System.out.print("\n" + Arr[x] + " ");
        }
    }
}

private void InsertionSort () {
    for(int x = this.begin; x < this.end; x++) {
        int currentNum = this.Arr[x];
        int hole = x;
        while((hole > 0) && (this.Arr[hole-1] > currentNum)) {
            this.Arr[hole] = this.Arr[hole-1];
            hole = hole - 1;
        }
        this.Arr[hole] = currentNum;
    }
}

private void merge (int left_start, int left_end, int right_start, int right_end) {
    /*
    int length = right_end - left_start;

    int[] temp = new int[length];
    int leftP = left_start;
    int rightP = right_start;
    int index = 0;

    while((leftP <= left_end) && (rightP < right_end)) {
        if(Arr[leftP] < Arr[rightP]) {
            temp[index++] = Arr[leftP++];
        }
        else {
            temp[index++] = Arr[rightP++];
        }
    }   
    while(leftP <= left_end) {
        temp[index++] = Arr[leftP++];
    }
    while(rightP < right_end) {
        temp[index++] = Arr[rightP++];
    }

    System.arraycopy(temp, 0, Arr, left_start, length);
    */

}
}

Ahora, estoy llamando a PSort.ParallelSort con una matriz de tamaño 40 llena de enteros aleatorios 0-9, y esta es la salida que obtengo:

New thread: 0 40
New thread: 0 20
New thread: 21 40
New thread: 0 10
New thread: 11 20
New thread: 21 30
New thread: 31 40
0 1 1 2 2 2 6 7 7 8 
8 3 3 3 4 4 5 5 6 7 
9 2 3 3 3 4 7 8 9 9 
2 2 6 7 7 7 8 8 9 9 

Tenga en cuenta que he comentado la sección "fusionar" de mi rutina, por lo que esperaría que cada línea individual de salida esté ordenada correctamente, pero ese no es el caso. Probé el InsertionSort por sí mismo, y parece que nunca falla, por lo que parece haber algunos problemas de concurrencia en el trabajo que estoy ignorando por completo.

Nota: Me doy cuenta de que hay algunos problemas más serios en el trabajo aquí, porque los números más altos están ponderados hacia las últimas dos filas de la matriz general, aunque no me estoy fusionando ...

Respuesta 1

Tengo un problema con uno de mis métodos en mi programa. El método está diseñado para tomar 2 listas de matrices y realizar la multiplicación entre las dos como un polinomio. Por ejemplo, si tuviera que decir ...

Estoy tratando de descomprimir la carpeta que contiene caracteres alemanes, por ejemplo, Aufhänge. Sé que en Java 7, está usando utf-8 por defecto, y creo que "ä" es uno de los caracteres utf-8. Aquí está mi ...

Cómo es que esto funciona: lA = nueva Lista (List.ORDERED, List.ALPHABETICAL); lA.setLowercase (List.LOWERCASE); lA.setPostSymbol (")"); pero esto no: lQL = nueva lista (List.UNORDERED); lQL.setListSymbol ("= ...

Necesito cargar una imagen generada en mi aplicación de escritorio Java. Estoy usando un código similar a este: BufferedImage img = null; pruebe {img = ImageIO.read (nuevo archivo ("strawberry.jpg")); } captura (...