Concurrencia com semaphores problema de 'Rendezvoud'

0 respostas
T

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:

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();
    }
}
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;
    }
}
Criado 24 de outubro de 2014
Respostas 0
Participantes 1