Olá Pessoal, estou com um problema no meu sistema e gostaria muito que se alguém soubesse uma solução me ajudasse. O problema é o seguinte estou desenvolvendo um sistema Applet que pega informaçoes da telnet e joga no sistema. Para isso usei uma classe no sistema q faz a conexao com o banco de dados (postgre) e fiz uma nova classe q extend umaThread que faz a conexao com a telnet.
Agora devido o grande volume de informações q pego da telnet meu sistema está ficando mutio lendo. Gostaria de saber se tem como fazer uma nova classe que pegue o resultado da telnet para eu poder dividir o fluxo de informação, se tiver como fazer isso deixo um pouco de informação na classe que faz a conexao com a telnet e o resto das informações em outra thread. Mas nao sei como vou fazer uma nova thread sem precisar fazer uma nova conxao com a Telnet. Se alguém souber por favor me de um help!!! Vlw!!!
- Crie uma pilha, para armazenar os eventos que chegam do Telnet.
- Faça sua classe do telnet empilhar esses eventos nessa pilha;
- Use outra thread para desempilhar esses eventos e disparar para o seu sistema.
Isso desafoga a classe do Telnet, que pode enviar a mensagem instantaneamente para cima, seja qual for o volume.
Para mim, evitou muitas dores de cabeça. O Java já tem uma classe pronta, thread-safe, que implementa essa pilha (não a thread de envio, só a pilha mesmo).
O nome dela é BlockingQueue. Só tome cuidado que existe um memory leak na blocking queue que só foi corrigido na versão 5 update 12 ou na 6 update 3.
Para criar uma BlockingQueue é só fazer:
private volatile BlockingQueue<MessageEvent> eventQueue =
new LinkedBlockingQueue<MessageEvent>();
O código da rua da thread de entrega dos eventos (message dispatching) geralmente é algo simples como:
[code]// Isso é chamado pela thread do telnet, para adicionar uma mensagem a pilha
public void add(MessageEvent event) {
eventQueue.offer(event);
}
//Esse é o Runnable, que roda numa outra threda.
//Ele só desempilha uma mensagem e joga para frente.
//O try…catch serve de proteção.
//Se o cliente que receber a mensagem gerar uma exceção, ela é logada e a thread de dispatching não morre.
private class DispatcherRun implements Runnable {
public void run() {
try {
while (shouldExist) {
MessageEvent msgEvent = null;
while (msgEvent == null && shouldExist)
msgEvent = eventQueue.poll(50, TimeUnit.MILLISECONDS);
if (msgEvent != null) {
try {
fireMessageArrived(msgEvent);
} catch (Exception e) {
//Logar. O cliente lançou uma exceção não capturada, que acabou caindo aqui na thread de dispatch.
}
}
}
catch (InterruptedException e) {
//Finalizamos o dispatch
}
}
}[/code]
Obrigada ViniGodoy , fiz como vc disse e funcionou!!!Vlw!!!