Bug com as Threads

3 respostas
J

Seguinte…
Tenho uma clase digamos “contralador” que tem um main que chama duas threads. Eu preciso que as threads sejam capazes de acessar os dados da classe controlador.
Basicamente os dados sao vetores e as threads chama metodos do controlador para adicionar um elemento no vetor ou retirar um elemento do vetor.
Meu problema: um metodo do controlador recebe dois elementos e adiciona cada um em um vetor. Outro metodo pega um elemento de cada um desses vetores, joga num ArrayList e retorna o array.
Fazendo execucao passo-a-passo (debug, eclipse) eu descobri que…
se eu ponho um breakpoint no metodo getElementos dentro do contralador, o programa funciona (retorna os dois elementos que eu queria).
Mas, se eu colocar o breakpoint dentro da thread que chama o metodo, nao dah certo: um dos elementos tah certo mas o outro nao (um vetor de tamanho zero).
Eu imagino que seja algum bug de acesso ao dado, sei la… algo a ver com sincronismo…

deu pra entender?

vlw!

3 Respostas

Mauricio_Linhares

Não, não deu pra entender. O que você quer que aconteça?

Java_Vinicius_Machin

A unica coisa que eh garantido com relação a Threads é que “nada é garantido”. Mas explica melhor ae quem sabe a gente não consiga te ajudar. :frowning:

J

vamo la.
Classe static Controlador:
-> instancia ThreadComunicacao, ThreadTratarCircuito, ThreadImprimir
-> metodos: addNaoTratado, addNaoImpresso, addNaoEnviado, getNaoTratado, getNaoImpresso, getNaoEnviado

Thread comunicao: recebe e envia mensagens via internet (atraves de agentes - saci).
Ela fica parada num while esparando mensagem recebida ou para enviar: (Controlador.getNaoEnviado == null || receiveMsg() == null). Metodo receive receb msg da internet. Quando ela recebe uma mensagem (receive != null) ela pega msg e da um Controlador.addNaoTratado

Thread TratarCircuito: Fica sempre perguntando Controlador.getTtratado(). Quando tem algum, ele trata e da um Controlador.addNaoImpresso()

Thread imprimir: Fica sempre perguntando Controlador.getNaoImpresso(). Quando tem algum, ele imprimi o circuito e da um Controlador.addNaoEnviado.

O controlador controla quais as mensagens de circuito nao tratado, nao impresso e nao enviado atraves de vetores.

o bug: o metodo addNaoImpresso possui dois parametros: uma mensagem e um vetor que representa o circuito que tah na mensagem jah tratado. Entao eu eu tenho dois vetores no controlador: um de mensagens e um de vetores do circuito. O add aparentemente funciona bem.
Quando eu dou o getNaoImpresso eu retorno um ArrayList com uma Mensagem e um vetor (o primeiro elementos dos vetores citados acima). Quando dah o return a mensagem tah ok, mas o vetor do circuito tah vazio!
Entretanto, se eu debugo o programa e coloca breakpoints nos metodos do controlador, funciona ok. por isso acho que seja alguma coisa relacionada aos bugs normal de thread: duas acessando a mesma coisa ao mesmo tempo.

to sem meu codigo nesse pc pra postar :frowning:

Deu pra entender, ou compliquei ainda mais?!

Criado 9 de junho de 2005
Ultima resposta 10 de jun. de 2005
Respostas 3
Participantes 3