Duda con programación concurrente en Java

Pues hace poco que he empezado con la programación concurrente y tengo algunas dudas jeje.

Tengo que hacer un programa cutrísimo para este viernes pero no me sale, consiste simplemente en que 4 procesos llamen a un programa que lo que haga sea escribir una letra.

Por ejemplo, el proceso 1 le pasa "a", el 2 "b", el 3 "c" y el 4 "d" y se tiene que ejecutar varias veces el programa para que el resultado del mismo sea: abcdabcdabcd...

El problema que tengo es que no se como manipular los métodos wait y notify para que se sincronicen bien y salga el orden correcto.

Os dejo la estructura del código que creo que debe ser:

class MostrarLletres2{
   
   public static void main (String[] args){
      EscriureLletra2 a= new EscriureLletra2("a");
      a.start();   
      EscriureLletra2 b= new EscriureLletra2("b");
      b.start();
      EscriureLletra2 c= new EscriureLletra2("c");
      c.start();
      EscriureLletra2 d= new EscriureLletra2("d");
      d.start();
   }
}


class EscriureLletra2 extends Thread{
   private Lletra2 l;
   private String s;
   
   public EscriureLletra2 (String str){
      s= str;
   }
   
   public void run(){
      l= new Lletra2();
      for (int i= 0; i< 100; i++){
         try{
            l.SetLletra(s);
            sleep( (int) (Math.random() * 3000));
         }
         catch (InterruptedException e){
            System.err.println("Exception " + e.toString());
         }
      }
   }
}


class Lletra2{
   private String valor;
   private boolean esperar = false;
   
   public synchronized void SetLletra (String s){
      
        }
}


Me falta hacer el método SetLletra (como ya se ve :-P), pero es que no me sale, cuando lo hago o bien consigo que se me queden todos los procesos en wait (con lo cual no acaba), o no funciona bien y simplemente no sigue ningún orden.

Esta función SetLletra simplemente debería guardar el valor s en la variable valor y hacer el print de ésta, además de hacer la sincronización con los métodos wait y notify, que es lo que no me sale.

He puesto un poco rollo, pero necesito ayuda!

Saludos y gracias!
debes usar 4 semaforos

un semaforo para cada proceso
los contadores de cada semaforo los inicializas a 0 salvo el primero(el del proceso que saca a)

en cada proceso hace wait al semaforo del anterior proceso (el anterior del 4 es el3,antes del 1 el 4,ciclico) luego print y luego signal(en java creo que es notify) a su semaforo

no se la sintaxis de java en concurrencia por eso lo cuento asi(si conoces la teoria de concurrencia lo entenderas)

pd:lo puedo poner el codigo en pascal si quieres
Siento responder tan tarde, gracias por la respuesta.

Aun sigo con el mismo problema y la verdad es que me vendría bien que me pusieras el código en pascal, a ver por lo menos la estructura.

Te dejo el código que yo había hecho, el cual no funciona bien, empieza a escribir letras pero no sigue el orden que debería.

class Lletra2{
   private String valor;
   private int n= 1;
   private boolean esperar1= false;
   private boolean esperar2= true;
   private boolean esperar3= true;
   private boolean esperar4= true;
   
   public synchronized void SetLletra (String s){
      
      if ((n==1)){
         
         while (esperar1){
            try{ wait(); }
            catch (InterruptedException e) {
            System.err.println("Exception "+ e.toString());
            }
         }
         
         valor= s;
         System.out.print(s);
         n= 2;
         esperar1= true;
         esperar2= false;
         esperar3= true;
         esperar4= true;
         notify();

      }
      else if ((n==2)){
         
         while (esperar2){
            try{ wait(); }
            catch (InterruptedException e) {
            System.err.println("Exception "+ e.toString());
            }
         }
                  
         valor= s;
         System.out.print(valor);
         n=3;
         esperar1= true;
         esperar2= true;
         esperar3= false;
         esperar4= true;
         notify();
      
      }
      else if ((n==3)){
         
         while (esperar3){
            try{ wait(); }
            catch (InterruptedException e) {
            System.err.println("Exception "+ e.toString());
            }
         }
                  
         valor= s;
         System.out.print(valor);
         n=4;
         esperar1= true;
         esperar2= true;
         esperar3= true;
         esperar4= false;
         notify();
         
      }
      else if ((n==4)){
         
         while (esperar4){
            try{ wait(); }
            catch (InterruptedException e) {
            System.err.println("Exception "+ e.toString());
            }
         }
         
         valor= s;
         System.out.print(valor);
         n=1;
         esperar1= false;
         esperar2= true;
         esperar3= true;
         esperar4= true;
         notify();
         
      }
   }
}
2 respuestas