Foro de elhacker.net

Programación => Java => Mensaje iniciado por: NathanD en 26 Septiembre 2014, 19:40 pm



Título: ¿Está mal este programa? Concurrencia y semáforos
Publicado por: NathanD en 26 Septiembre 2014, 19:40 pm
Buenas,

estoy con programación concurrente, y la verdad es que me cuesta bastante. En este caso, el ejercicio propuesto es un programa cuya salida sea:
A
BB
CCC
A
BB
CCC
etc.

Donde cada hilo imprime su letra. Esto es lo que he hecho, cuya salida es correcta:

Código
  1. public class HiloLetra implements Runnable{
  2.  
  3. char letra;
  4. int numVeces;
  5. Buffer buffer; //Recurso compartido
  6. static int turno;
  7.  
  8.  
  9. public HiloLetra(char letra, int numVeces, Buffer buffer) {
  10. this.letra = letra;
  11. this.numVeces = numVeces;
  12. this.buffer = buffer;
  13. }
  14.  
  15.  
  16. @Override
  17. public void run() {
  18. while(true) {
  19. try {
  20. buffer.imprimirLetra(letra, numVeces);
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }
  26. }
  27.  

Código
  1. import java.util.concurrent.Semaphore;
  2.  
  3.  
  4. public class Buffer {
  5.  
  6. int numeroLetras;
  7. Semaphore arrayCandados[];
  8. int posicionArray;
  9.  
  10.  
  11. public Buffer(int numeroLetras) {
  12. this.numeroLetras = numeroLetras;
  13. arrayCandados = new Semaphore[this.numeroLetras];
  14. posicionArray = 0;
  15. crearCandados();
  16. }
  17.  
  18. private void crearCandados() {
  19. arrayCandados[0] = new Semaphore(1);
  20. for(int i = 1; i < numeroLetras; i++) {
  21. arrayCandados[i] = new Semaphore(0);
  22. }
  23. }
  24.  
  25. public void imprimirLetra(char letra, int numeroLetra) throws InterruptedException {
  26.  
  27. while(numeroLetra-1 == posicionArray) {
  28. arrayCandados[posicionArray].acquire(numeroLetra);
  29.  
  30. for(int i = 0; i < numeroLetra; i++) {
  31. System.out.print(letra/*+", posicion array: "+posicionArray*/);
  32. }
  33. System.out.println();
  34.  
  35. posicionArray++;
  36. if(posicionArray == numeroLetras) {
  37. posicionArray = 0;
  38. }
  39.  
  40. arrayCandados[posicionArray].release(posicionArray+1);
  41. }
  42. }
  43. }
  44.  

Código
  1. public class Principal {
  2.  
  3. final int NUMERO_LETRAS = 3;
  4.  
  5.  
  6. HiloLetra runnables[];
  7. Thread hilosLetras[];
  8. Buffer buffer;
  9.  
  10.  
  11. public Principal() {
  12. runnables = new HiloLetra[NUMERO_LETRAS];
  13. hilosLetras = new Thread[NUMERO_LETRAS];
  14. buffer = new Buffer(NUMERO_LETRAS);
  15. crearHilos();
  16. }
  17.  
  18. private void crearHilos() {
  19. for(int i = 0; i < NUMERO_LETRAS; i++) {
  20. runnables[i] = new HiloLetra((char)(i+'A'), i+1, buffer);
  21. //System.out.println("creado hilo "+(char)(i+'A')+", num veces: "+(i+1));
  22. hilosLetras[i] = new Thread(runnables[i]);
  23. }
  24. }
  25.  
  26. private void iniciarHilos() {
  27. for(int i = 0; i < NUMERO_LETRAS; i++) {
  28. hilosLetras[i].start();
  29. }
  30. }
  31.  
  32.  
  33. public static void main(String[] args) {
  34. Principal principal = new Principal();
  35. principal.iniciarHilos();
  36. }
  37.  
  38.  
  39.  
  40. }

Buffer es la clase donde se guarda el array de semáforos, y cuya instancia es un recurso compartido por todos los hilos.

Como he dicho, la salida del programa es correcta. Pero mi duda radica en si la concurrencia de veras está bien gestionada. Porque, mientras se ejecuta el programa, el administrador de tareas indica que la CPU está al 100%, lo cual me hace pensar que no se estén gestionando bien los hilos.

Gracias de antemano y saludos.


Título: Re: ¿Está mal este programa? Concurrencia y semáforos
Publicado por: NathanD en 4 Octubre 2014, 20:07 pm
¿Nadie?