Dúvida sobre Threads

8 respostas
S

Salve galera do guj! Tenho dois listener ( uma escuta para socket e a outra para porta serial), quero que eles rodem ao mesmo tempo. O método que pensei é criar uma thread pra cada método ou trecho de código. Eu dei uma pesquisada aqui, pelo que entendi para que os dois processos estejam ativos “ao mesmo tempo” basta não declarar syncronized, ísso é verdade?
Obrigado pela ajuda, e ótimo dia a todos :wink:

8 Respostas

D

Não li muito sobre Threads ainda, mas pelo que vi a diferença é que o syncronized permite que apenas um segmento utilize o objeto por vez. Se outro tentar usar o mesmo objeto terá que esperar. Ou seja, ambos executaram “ao mesmo tempo” só que no caso do syncronized um vai ter que esperar o outro em certos casos.

Mas espere aparecer alguém quem entende desse assunto pra dar uma opinião. O ViniGodoy provavelmente responderá quando ver o tópico :wink:

Andre_Fonseca

oi

vc já leu este tutorial?? acho que ele responde a sua dúvida

abs

S

é, foi com ele que comecei a estudar threads. Só não tenho muita prática no assunto, mesmo assim obrigado. Meu problema ainda não foi resolvido.
Imagine que preciso enviar e receber dados via serial. Tenho um listener por socket, quando eu receber dados via socket eu paro de ler a serial e escrevo nela. terminado isso eu volto a ler. Eu tentei fazer duas thread separadas, mas dá o erro:

endo na porta socket
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7
Lendo na porta serial...
Lendo na porta serial...
Aguardando...
 Usu/senha= LULA/13 Ordem = L2Liga
Acesso Permitido!
Erro abrindo comunicação: gnu.io.PortInUseException: Unknown Application
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 6 segundos)
Andre_Fonseca

oi

acho que você precisa criar uma thread para tratar as requisições do socket e outra da porta serial, ai você coloca synchronized em cada método garantindo que apenas uma thread acessa o método em determinado tempo

ficaria algo assim

Thread t1 = new Thread() // t1 trata socket

while(listenerEscutaSocket()) {

t1.start() // inicia outra thread para tratar sockets

}

Thread t2 = new Thread() // t2 trata porta serial

while (listenerEscutaPortaSerial()) {

t2.start(); // inicia outra thread para tratar porta serial

}</blockquote>

coloca mais detalhes da sua implementacao talvez a gente possa ajudar

abs

S

bom, alterei bastante o código, ele agora está deixando rodar em conjunto. Não é o mais indicado, mas tratei no braço mesmo. FIcou assim:

// importa classes necessarias para o funcionamento do programa
         public class Casa extends Thread
         {
          private static String USER="LULA/13"; // variaveis que serão usadas para validar os pacotes
         private  static String Ordem=""; //comando de ordem para acender/apagar determinada lâmpada
       static boolean status = true;
         public static void main (String[] args)
          {
            		roda();
                        serial();                                
         }
         public static void serial(){
             new Thread(){
                 	public void run(){
		  PortaSerial porta = new PortaSerial();
                                 while(true){
                                        if(status){// se status for true então a porta está livre para leitura
                                                      try{
                                                             System.out.println("Lendo na porta serial...");
                                                             Thread.sleep(1);
                                                                     try{
                                                         porta.Leitura();
                                             }catch(Exception e){System.out.println("Porta esta sendo usada");}
                                             }catch(InterruptedException ex){}
                                                        }
                                         else{System.out.println("Porta está sendo usada para gravação");
                                               try{
                        Thread.sleep(1);
                
                     }catch(Exception interrompido){}
                  	// Chama classe de porta serial com o parâmetro Ação.
                       ConverteOrdem converte = new ConverteOrdem();
                       porta.Escrita( converte.Converte(Ordem));
                       status=true;
                                   }//else
                                          }//while
                                                 }//run
		                   }.start(); 
         }//método
         //escuta para socket
        static void  roda(){
            new Thread(){
public void run(){
while(true){
    System.out.println("Lendo na porta socket");
//Ordem="";
            ServerSocket SocketServidor = null;
           Socket Socket = null;
           BufferedReader Entrada = null; // Declara os objetos usados.Usamos também a ServerSocket que fará a parte de //escuta.
           try{
             SocketServidor = new ServerSocket(8000); // instancia serversocket e coloca a porta 8000
             Socket = SocketServidor.accept(); // 1
             System.out.println("Aguardando...");
             Entrada = new BufferedReader(new InputStreamReader(Socket.getInputStream())); //2

               //inicia variaveis

                 String mensagem;
                mensagem = Entrada.readLine(); // guarda o pacote que recebeu do cliente na variavel mensagem
//regra de negocio para tratamento da string, pulei essa parte
//aqui foi o código para tratar a mensagem e peagar a ordem
	
                     
                  if(Usuario.equals(USER)){
                  	System.out.println("Acesso Permitido!");

//setando o status como false será escrito na porta serial
                        status = false;
                                  
                                    }else{

                  	System.out.println("Mensagem recebida,mas acesso Negado!");
                  	}
                  }

           catch( IOException excecao){
           System.out.println("Ocorreu erro para criar ou receber o socket.");
	          }
         finally{
			 try{
				 Socket.close();
				 SocketServidor.close();
			 }
			 catch(IOException excecao){
			 }

			 }
}//loop eterno
		}
				}.start(); 
			 }//roda
			}//classe
S

só que o problema agora é que na primeira vez que eu envio dados funciona… na segunda ele manda em branco

renzonuccitelli

O modificador synchronized faz com que qdo o mesmo está sendo executado por uma thread, nenhuma outra possa acessar os recursos da classe. Assim, a coisa depende de como vc quer que elas funcionem. Se vc kiser que os dois listener funcionem de forma indepente, Cria uma classe para cada Listener que extenda a classe thread e que fique escutando as portas no seu respectivo método run.
Caso vc queira que quando uma estiver se comunicando a outra fique bloqueada, deixa as duas na mesma classe, fazendo um método syncronized para cada uma que serão todos chamados dentro do método run de uma Thread

S

obrigado pela ajuda ^^. consegui de outra forma. O que eu é manter uma semi-independência entre as classes: as duas executam ao mesmo tempo, mas só pdoe escrever quando não estiver lendo. Então, normalmente eu leio a porta serial e a porta do socket ‘ao mesmo tempo’. Se eu receber algo via socket eu não envio para serial, mas aciono um marcador que fará isso na prórpia classe de leitura. Então ao invez de ler ( na parte de leitura), eu escrevo. Obrigado pela ajuda :wink:

Criado 3 de outubro de 2008
Ultima resposta 3 de out. de 2008
Respostas 8
Participantes 4