Pattern Observer + Threads  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
braian
Thread.start()
[Avatar]

Membro desde: 18/04/2009 17:44:37
Mensagens: 45
Offline

Fala galera, tudo bem!?

Estou querendo desenvolver um projeto utilizando threads e estou com algumas dúvidas.
Gostaria de dicas para o desenvolvimento.

Bem, segue alguns detalhes da implementação...

Como mencionei logo acima, o projeto será desenvolvido utilizando threads e o padrão de projeto Observer (ainda estou estudando o Pattern Observer).

Funcionamento:
- Uma thread principal invocará várias outras threads que executaram atividades distintas.
- Haverá uma tabela "informativa" que conterá alguns dados referentes as threads (Ex.: Nome da Thread, Status (1 ativa, 0 - Desativada), Data última Execução e uma coluna "Situação" onde poderemos parar ou subir uma thread.
- Coluna "Situação": A coluna situação conterá dois valores (1 - Ligar, 0 - Desligar). As threads só sobem se estiverem com situação igual a 1. Caso altere o valor de situação a thread principal desligará a thread secundária correspondente (A thread principal terá um método que ficará lendo a situação de cada thread e executará a ação correspondente).
- A thread principal deverá ter o controle total de todas as threads secundárias. Deverá receber as notificações de paradas e starts das threads. Assim poderá controlar dinamicamente cada thread.

A princípio eu estava pensando em fazer isso com o Padrão Observer (não sei se é possível ou se é uma boa escolha), gostaria de sugestões para esse projeto.


Bem pessoal, é basicamente isso!
Desde já, obrigado a todos.

This message was edited 1 time. Last update was at 08/02/2012 17:16:12


Em busca de conhecimento...
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Olá. Por favor, não use as tags informativas como [Resolvido] para dizer algo óbvio, como [Dúvida].


Quanto à sua dúvida, acho que o padrão observer é interessante para que as threads notifiquem a tabela principal de seu status. As threads poderiam disparar um evento e, ao recebe-lo, você atualizaria o tablemodel.

Você pode fazer as threads pararem/religarem através de uma variável compartilhada.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
braian
Thread.start()
[Avatar]

Membro desde: 18/04/2009 17:44:37
Mensagens: 45
Offline

ViniGodoy wrote:Olá. Por favor, não use as tags informativas como [Resolvido] para dizer algo óbvio, como [Dúvida].


Quanto à sua dúvida, acho que o padrão observer é interessante para que as threads notifiquem a tabela principal de seu status. As threads poderiam disparar um evento e, ao recebe-lo, você atualizaria o tablemodel.

Você pode fazer as threads pararem/religarem através de uma variável compartilhada.


Olá ViniGodoy,
Você teria algum exemplo desse tipo de funcionamento (uma thread enviado uma notificação via "evento" para outras threads usando o Pattern Observer)?
Obrigado!


Em busca de conhecimento...
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Só esclarecendo. Threads não são classes. Threads não conseguem enviar algo para outras threads.

Se você quer que duas threads se comuniquem, precisa fazê-lo através de uma área compartilhada de memória, normalmente, uma synchronizedQueue.

Funciona assim:
a) Uma thread quer notificar algo, ela insere um dado na synchronizedQueue;
b) Outra thread está interessada na notificação, ela lê a synchronizedQueue.

Um dos exemplos clássicos é o algorítmo do produtor/consumidor. Uma thread gera algo que outra consome, e avisa sempre que é gerado.
Anexei um exemplo, está em C++ mas o funcionamento é igual em Java.

Eu sei que tenho um exemplo parecido em Java em algum lugar, anexo aqui assim que encontrar.

Preste atenção no seguinte:

- As classes de sensor geram os dados (no caso, representei isso gerando um número aleatório a cada 200ms), e simplesmente disparam esses dados para seus listeners (classe Processador);
- A classe do processador escuta os sensores e agrupa os dados recebidos numa fila. Quem faz a inserção na fila é a thread do sensor;
- A classe do processador lê os dados dessa fila e os processa. Quem faz a leitura é a thread do processador;

Como o acesso da fila é compartilhado pelas 3 threads, é necessário usar lock para garantir que apenas uma das thread esteja trabalhando sobre a fila (exclusão mútua).

Nesse padrão, o sensor é chamado de produtor (já que ele produz eventos) e o processador de consumidor (já que ele processa os eventos gerados).
 Nome do arquivo ExemploThreads.7z [Disk] Download
 Descrição Exemplo de threads em C++. É necessário a boost para compilar. Foi testado no Visual Studio 2010.
 Tamanho 2 Kbytes
 Baixado:  9 vez(es)

This message was edited 1 time. Last update was at 09/02/2012 05:45:35


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
braian
Thread.start()
[Avatar]

Membro desde: 18/04/2009 17:44:37
Mensagens: 45
Offline

ViniGodoy wrote:Só esclarecendo. Threads não são classes. Threads não conseguem enviar algo para outras threads.

Se você quer que duas threads se comuniquem, precisa fazê-lo através de uma área compartilhada de memória, normalmente, uma synchronizedQueue.

Funciona assim:
a) Uma thread quer notificar algo, ela insere um dado na synchronizedQueue;
b) Outra thread está interessada na notificação, ela lê a synchronizedQueue.

Um dos exemplos clássicos é o algorítmo do produtor/consumidor. Uma thread gera algo que outra consome, e avisa sempre que é gerado.
Anexei um exemplo, está em C++ mas o funcionamento é igual em Java.

Eu sei que tenho um exemplo parecido em Java em algum lugar, anexo aqui assim que encontrar.

Preste atenção no seguinte:

- As classes de sensor geram os dados (no caso, representei isso gerando um número aleatório a cada 200ms), e simplesmente disparam esses dados para seus listeners (classe Processador);
- A classe do processador escuta os sensores e agrupa os dados recebidos numa fila. Quem faz a inserção na fila é a thread do sensor;
- A classe do processador lê os dados dessa fila e os processa. Quem faz a leitura é a thread do processador;

Como o acesso da fila é compartilhado pelas 3 threads, é necessário usar lock para garantir que apenas uma das thread esteja trabalhando sobre a fila (exclusão mútua).

Nesse padrão, o sensor é chamado de produtor (já que ele produz eventos) e o processador de consumidor (já que ele processa os eventos gerados).



Obrigado ViniGodoy,
Deu pra ter uma noção (pena que não muita noção de C++).
Se encontrar o código java melhor ainda.
De qualquer forma, obrigado pelas dicas.

Em busca de conhecimento...
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Achei. Estava aqui no meu trabalho.

Segue o exemplo. A classe Produtora produz e dispara um evento. Cada consumidor (Observer) pode ser registrado a um Produtor (Observable).
Cada consumidor tem sua própria lista de eventos, que é sincronizada manualmente (em blocos synchronized). O código poderia ser deixado mais simples se a classe de lista sincronizada do Java fosse utilizada (LinkedBlockingQueue).
 Nome do arquivo ProdutorConsumidor.7z [Disk] Download
 Descrição Produtor/Consumidor em java.
 Tamanho 1 Kbytes
 Baixado:  14 vez(es)

This message was edited 1 time. Last update was at 09/02/2012 09:32:53


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team