Problema con Pila (Stack), Hilos (Thread) y Lista números (Array)

Iniciado por S_Code, 26 Mayo 2016, 11:33 AM

0 Miembros y 2 Visitantes están viendo este tema.

S_Code

Buenos días.

Tengo un problema con un ejercicio y no se como solucionarlo.
El problema es que el código hace cada vez una cosa diferente:

- Se queda colapsado
- Se para y no realiza bien todo lo que tiene que hacer
- Da un error del tipo: ArrayOutIndexException
- Funciona correctamente

Dejo el código a ver si alguien puede ayudarme:

Clase principal

Código (java) [Seleccionar]

package quicksort;

import java.util.Stack;
import java.util.Arrays;

public class QuicksortTarea {
static Stack<int[]> pila = new Stack<int[]>();
static int[] numeros = { 11, 25, 3, 9, 4 };

public static void main(String[] args) {
System.out.println("Array de números sin ordenar");
imprimirArrayNumeros(numeros);
controlPilas();
// Mostramos el array ordenado
System.out.println("\nArray de números ordenados");
imprimirArrayNumeros(numeros);
}

// Método que muestra el array de números
public static void imprimirArrayNumeros(int numeros[]) {
for (int contador = 0; contador < numeros.length; contador++) {
System.out.print(numeros[contador] + " ");
}
}
public synchronized static void controlPilas() {
//Introducimos la primera tarea en la pila
int[] paso1 = new int[3];
paso1 [0] = 0;
paso1 [1] = numeros.length-1;
//Indica si tiene thread 0 - NO / 1 - SI
paso1 [2] = 0;
pila.add(paso1);
while (!pila.isEmpty()) {
while (pila.get(pila.size()-1)[2] == 0) {
ThreadTarea tarea = new ThreadTarea(pila, numeros, pila.get(pila.size()-1)[0], pila.get(pila.size()-1)[1]);
tarea.start();
pila.get(pila.size()-1)[2] = 1;
}
}
}
}


Clase Thread


Código (java) [Seleccionar]

package quicksort;

import java.util.Arrays;
import java.util.Stack;

public class ThreadTarea extends Thread {
Stack<int[]> pila;
int[] array;
int izquierda;
int derecha;

public ThreadTarea(Stack<int[]> pila, int[] array, int izquierda, int derecha) {
this.pila = pila;
this.array = array;
this.izquierda = izquierda;
this.derecha = derecha;
}

//Stack<int[]> pila, int[] array
public void run() {
//Guardamos los primeros valores de la pila
int min =  pila.get(pila.size()-1)[0];
int max =  pila.get(pila.size()-1)[1];
//Usamos como pivote el valor de la izquierda
int pivote = array[izquierda];
System.out.println("\n El pivote es : " + pivote);
//Creamos un boolean para comprobar el lado del array en el que estamos, siendo lado izquierdo = true y lado derecho = false
boolean lado = false;
while (izquierda < derecha) {
if (lado == true) {
if (array[izquierda] <= pivote) {
izquierda++;
}
else {
array[derecha] = array[izquierda];
derecha--;
lado = false;
}
}
else {
if (array[derecha] > pivote) {
derecha--;
}
else {
array[izquierda] = array[derecha];
izquierda++;
lado = true;
}
}
}
//Cambiamos el pivote de lado
array[derecha] = pivote;
// Comprobamos si necesitamos añadir nuevas tareas a la pila
if (izquierda > min) {
int[] paso2 = new int[3];
paso2 [0] = min;
paso2 [1] = izquierda-1;
paso2 [2] = 0;
pila.add(paso2);
}
if (derecha < max-1) {
int[] paso3 = new int[3];
paso3 [0] = derecha+1;
paso3 [1] = max;
paso3 [2] = 0;
pila.add(paso3);
}
//Eliminamos la tarea de la pila porque ya se ha utilizado
pila.remove(pila.size()-1);
}
}


Gracias de antemano.

S_Code

Buenos días, de nuevo.

Al final he conseguido solucionar los problemas, era un problema de sincronización de la pila. Pero ahora tengo otro:

- El programa funciona perfectamente con el código que aquí pongo, el problema viene cuando quiero darle un tamaño determinado al array o incluso poner otros números, no llega a salir del bucle de la clase principal con lo cual no muestra el mensaje del array ordenado.

Pongo aquí el código actual a ver si alguien consigue decirme porque no llega a finalizar el programa. Gracias de antemano.

Clase principal
Código (java) [Seleccionar]
package quicksort;

import java.util.Stack;
import java.util.Arrays;

public class QuicksortTarea {
static Pila pila = new Pila ();
static int[] numeros = {11, 2, 3, 8, 4, 1, 10};
// static int[] numeros = new int [8];
static ThreadTarea tarea;
public static void main(String[] args) throws InterruptedException {
// rellenarArray(numeros);
System.out.println("Array de números sin ordenar : ");
imprimirArrayNumeros(numeros);
controlPilas();
//Mostramos el array ordenado
System.out.println("\nArray de números ordenados : ");
imprimirArrayNumeros(numeros);
}

// Método que rellena el array con números aleatorios
public static void rellenarArray(int numeros[]) {
for (int contador = 0; contador < numeros.length; contador++) {
numeros[contador] = numeroAleatorio();
}
}

//Método que devuelve un número aleatorio
public static int numeroAleatorio() {
int num = (int) (Math.random() * 10);
return num;
}

//Método que muestra el array de números
public static void imprimirArrayNumeros(int numeros[]) {
for (int contador = 0; contador < numeros.length; contador++) {
System.out.print(numeros[contador] + " ");
}
}
//Método control tarea pilas
public synchronized static void controlPilas() throws InterruptedException {
//Introducimos la primera tarea en la pila
int[] paso1 = new int[3];
paso1 [0] = 0;
paso1 [1] = numeros.length-1;
//Indica si tiene thread 0 - NO / 1 - SI
paso1 [2] = 0;
//Añadimos el array de la tarea a la pila
pila.masTarea(paso1);
//Mientras la pila este llena
while (pila.llena() == false) {
//Si la posición donde se indica el thread es 0, lo creamoos
while (pila.dimo()[2] == 0) {
tarea = new ThreadTarea(pila, numeros);
tarea.start();
//Cambiamos el valor
pila.dimo()[2] = 1;
}
tarea.sleep(200);
}
}
}



Clase Thread

Código (java) [Seleccionar]
package quicksort;

import java.util.Arrays;
import java.util.Stack;

public class ThreadTarea extends Thread {
//Pila y array
static Pila pila = new Pila ();
int[] array;
/**
* Constructor del thread
*/
public ThreadTarea(Pila pila, int[] array) {
this.pila = pila;
this.array = array;
}
    /**
     * Método del run del thread
     */
    @Override
public void run() {
//Asignamos los valores de inicio y final de la pila
int izquierda = pila.dimo()[0];
int derecha =  pila.dimo()[1];
//Guardamos los primeros valores de la pila en otras variables para despues
int min =  pila.dimo()[0];
int max =  pila.dimo()[1];
//Usamos como pivote el valor de la izquierda
int pivote = array[izquierda];
//Boolean para controlar los lados que colocamos
boolean lado = false;
//Mientras izquierda sea menor o igual que derecha
while (izquierda != derecha) {
//Lado izquierdo
if (lado) {
if (array[izquierda] <= pivote) {
izquierda++;
}
else {
array[derecha] = array[izquierda];
derecha--;
lado = false;
}
}
//Lado derecho
else {
if (array[derecha] > pivote) {
derecha--;
}
else {
array[izquierda] = array[derecha];
izquierda++;
lado = true;
}
}
}
//Intecambiamos los números
array[derecha] = pivote;
//Comprobamos si necesitamos añadir nuevas tareas a la pila
if (izquierda > min) {
int[] paso2 = new int[3];
paso2 [0] = min;
paso2 [1] = izquierda-1;
paso2 [2] = 0;
pila.masTarea(paso2);
System.out.println(" SEGUNDA TAREA ");
}
if (derecha < max-1) {
int[] paso3 = new int[3];
paso3 [0] = derecha+1;
paso3 [1] = max;
paso3 [2] = 0;
pila.masTarea(paso3);
System.out.println(" TERCERA TAREA ");
}
//Eliminamos la tarea de la pila porque ya se ha utilizado
pila.quitarTarea(pila.size());
}
}


Clase Pila


Código (java) [Seleccionar]
package quicksort;

import java.util.Stack;

public class Pila {

static Stack<int[]> pila = new Stack <int[]>();
static int dim = pila.size();

public Pila() {
super();
}

public synchronized static int[] dimo() {
return pila.get(pila.size()-1);
}
public synchronized void masTarea (int [] tarea) {
pila.add(tarea);
}
public synchronized void quitarTarea (int tam) {
if (pila.size() >= 1) {
pila.remove(tam);
}
else {
return;
}
}
public synchronized boolean llena (){
if (pila.isEmpty()) {
return true;
}
else {
return false;
}
}
public synchronized int size() {
if (pila.size() >= 1) {
return dim;
}
else {
return 0;
}
}
public synchronized int[] get(int i) {
return null;
}

}