Concurrencia com semaphores problema de 'Rendezvoud'

Ola,

Tenho dois classes que implementam Runnablem, e que tem o metodo que vao fazer as declaracaoes:

System.out.println(“declaração a1”); //na class Thr
System.out.println(“declaração a2”); //na class Thr

System.out.println(“declaração b1”); //na class ThrB
System.out.println(“declaração b2”); //na class ThrB

Mas, tem que estar na sequencia de maneira que a1 ocurre antes que b2 e b1 occurre antes a2.

Então, eu estou tentando implmentar um sistema como:

Thread Thr
1 declaracao a1
2 aArrived.release();
3 bArrived.acquire();
4. declaracao a2

Thread ThrB
1 declaracao ab
2 bArrived.release();
3 aArrived.acquire();
4. declaracao ab

Mas não funciona de maneira que eu gostaria:

[code]import java.util.concurrent.Semaphore;
import java.util.Random;

public class Thr implements Runnable{
private int id;

public static Semaphore aArrived = new Semaphore(1);
public static Semaphore bArrived = new Semaphore(1);

public Thr(int id){
    this.id = id;
}

@Override
public void run(){
    try{
    executa();
   } catch (InterruptedException e){
    
    }
}

public int getID(){
    return id;
}




public void executa() throws InterruptedException {

    
    System.out.println("declaração a1");
      Thr.aArrived.release();
    Thr.bArrived.acquire();
    System.out.println("declaração a2");
   
}





public static void main(String[] args) throws InterruptedException{
    Thread t = new Thread(new Thr(1));
    Thread t2 = new Thread(new ThrB(1));
    

            t.start();
            t2.start();
}

}

[/code]

public class ThrB implements Runnable
{
    private int id;

    public ThrB(int id){
        this.id = id;
    }
    
    @Override
    public void run()  {
        try{
        executa(); 
       } catch (InterruptedException e){
        
        }
    }
    
    public void executa() throws InterruptedException{
         
        
        System.out.println("declaração b1");
        Thr.bArrived.release();
        Thr.aArrived.acquire();
        System.out.println("declaração b2");
        
        
        
    }
    
    public int getID(){
        return id;
    }
}