O que faz essa linha [RESOLVIDO]

1. O que faz essa linha [RESOLVIDO]

Bruna Almeida
FennFelis

(usa Ubuntu)

Enviado em 08/07/2012 - 19:08h

Tenho o seguinte código:
Queria saber o que acontece com as threads que tentam acessar a variavel dados e quem_enviou quando o semaforo está acquire


Vector dados, quem_enviou;
dados = new Vector();
quem_enviou = new Vector();
String linha_sql;

linha_sql = leitor.readLine();
while(!linha_sql.equals("desconectei")){
try {
semaforo.acquire();
} catch (InterruptedException ex) {
Logger.getLogger(ConexaoServidor.class.getName()).log(Level.SEVERE, null, ex);
}
dados.addElement(linha_sql);
quem_enviou.addElement(cliente);
sendToAll();
semaforo.release();
linha_sql = leitor.readLine();
}



  


2. Re: O que faz essa linha [RESOLVIDO]

Daniel Lara Souza
danniel-lara

(usa Fedora)

Enviado em 08/07/2012 - 20:05h

Procure não duplica o Tópico
seja paciente
alguém irá de ajudar




3. Re: O que faz essa linha [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 08/07/2012 - 20:13h

Depende de como você inicializou a variável "semaforo". Por exemplo:

private final Semaphore semaforo = new Semaphore(100, true);  


Essa definição permite que até 100 threads poderão acessar as variaveis "dados" e "quem_enviou".

Já dessa forma:

private final Semaphore semaforo = new Semaphore(1, true);  


Significa que, a partir do momento que uma thread execute o método "acquire", essa thread vai sinalizar que o semáforo está em uso, fazendo com que todas as outras threads fiquem bloqueadas ao executar também o método "acquire". Ou seja, se uma segunda thread executar esse método, ela ficará em sleep nele, e somente quando a primeira thread executar o "release" do semáforo, a segunda thread acorda e continua sua execução.


4. Re: O que faz essa linha [RESOLVIDO]

Bruna Almeida
FennFelis

(usa Ubuntu)

Enviado em 08/07/2012 - 20:25h

hcabzlus escreveu:

Depende de como você inicializou a variável "semaforo". Por exemplo:

private final Semaphore semaforo = new Semaphore(100, true);  


Essa definição permite que até 100 threads poderão acessar as variaveis "dados" e "quem_enviou".

Já dessa forma:

private final Semaphore semaforo = new Semaphore(1, true);  


Significa que, a partir do momento que uma thread execute o método "acquire", essa thread vai sinalizar que o semáforo está em uso, fazendo com que todas as outras threads fiquem bloqueadas ao executar também o método "acquire". Ou seja, se uma segunda thread executar esse método, ela ficará em sleep nele, e somente quando a primeira thread executar o "release" do semáforo, a segunda thread acorda e continua sua execução.


Qual o significado do parametro "true" no construtor?


5. Re: O que faz essa linha [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 08/07/2012 - 20:46h

O "true" é para que o semáforo garanta o "first-in first-out" (conceito de fila) para concessão de licenças de uso das threads contidas. Ou seja, digamos que você tenha 1 thread que bloqueou o semáforo, e duas tentam e ficam esperando a primeira liberar, à segunda que tentou usar o semáforo (consequentemente a primeira a ser retida) será a primeira a ser liberada a usar o semáforo quando o mesmo for liberado pela primeira thread.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts