MultiThreading

2 respostas
DHS

Galera estou estudando o capítulo 23 do Java como Programar, Deitel e tem um exemplo que é assim:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class SynchronizedBuffer implements Buffer {
    
    private Lock accessLock = new ReentrantLock();
    
    private Condition canWrite = accessLock.newCondition();
    private Condition canRead = accessLock.newCondition();
    
    
    private int buffer = -1;
    private boolean occupied = false;
    
    
    public void set(int value){
        
        accessLock.lock();
        
        try{
            
            while(occupied){
                System.out.println("Producer tries to write");
                displayState("Buffer full. Producer waits");
                canWrite.await();
            }
            
            buffer = value;
            
            displayState("Producer writes: "+ buffer);
            
            canRead.signal();
        }catch(InterruptedException exception){
            exception.printStackTrace();
        }
        finally{
            accessLock.unlock();
        }
    }
    
    public int get(){
        
        int readValue = 0;
        accessLock.lock();
        
        try{
            while(!occupied){
                System.out.println("Consumer tries to read");
                displayState("Buffer empty. Consumer waits");
                canRead.await();
            }
            
            occupied = false;
            
            readValue = buffer;
            displayState("Consumers reads: "+ readValue);
            
            canWrite.signal();
        }
        catch(InterruptedException exception){
            exception.printStackTrace();
        }finally{
            accessLock.unlock();
        }
        return readValue;
    }
    
    
    public void displayState(String operation){
        System.out.printf("%-40s%d\t\t%b\n\n", operation, buffer, occupied);
    }
Mas assim, na linha 26   canWrite.await();

e na linha 34 canRead.signal();

canRead e canWrite são variáveis de instância de objeto retornado pelo método accessLock.newCondition(). O método accessLock.newCondition() retorna um objeto do tipo Condition, ok!

Mas Condition é uma interface, logo não tem uma implementação do método. Por polimorfismo ele pode estar executando esse método de alguma classe que implemente Conditions mas qual classe é essa?

Na API está

All Known Implementing Classes:

AbstractQueuedLongSynchronizer.ConditionObject, AbstractQueuedSynchronizer.ConditionObject

Nenhuma eu fiz menção no código

se await e signal possuem a função  de colocar uma thread para estado de espera e  sinalizar que pode tirar a thread do estado de espera para executável quando esta ganhar a lock, algum código tem que ter para realizar isso

Ajude - me por favor, to perdido nisso…

2 Respostas

rodrigo.bossini

Sua pergunta tem mais a ver com polimorfismo do que com processamento paralelo.

Sim, é exatamente isso que ocorre.

Você utilizará os métodos presentes na interface Condition para interagir com este objeto.

Obviamente, o objeto retornado implementa Condition.

Se você quiser, pode ver qual é o tipo do objeto, diretamente nos fontes do java.

No seu JDK, tem um arquivo chamado src.zip. Ele contém as implementações de todas as classes e métodos da API padrão do Java SE. Divirta-se.

Eder_Peixoto

Invoque o método getClass() no objeto Condition e saberá qual é a classe.

Criado 13 de junho de 2010
Ultima resposta 13 de jun. de 2010
Respostas 2
Participantes 3