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
Clase Thread
Clase Pila
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;
}
}