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 
Dúvida sobre Threads
8 Respostas
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 
é, 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)
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 socketwhile(listenerEscutaSocket()) { t1.start() // inicia outra thread para tratar sockets }Thread t2 =
new Thread()// t2 trata porta serialwhile (listenerEscutaPortaSerial()) { t2.start(); // inicia outra thread para tratar porta serial }</blockquote>coloca mais detalhes da sua implementacao talvez a gente possa ajudar
abs
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ó que o problema agora é que na primeira vez que eu envio dados funciona… na segunda ele manda em branco
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
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 