| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/02/2012 16:02:44
|
braian
Thread.start()
![[Avatar]](/images/avatar/aa5da9627b5d747c2dbce5c29c319116.jpg)
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... |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/02/2012 17:15:57
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/02/2012 20:23:55
|
braian
Thread.start()
![[Avatar]](/images/avatar/aa5da9627b5d747c2dbce5c29c319116.jpg)
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... |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/02/2012 05:43:17
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/02/2012 08:41:15
|
braian
Thread.start()
![[Avatar]](/images/avatar/aa5da9627b5d747c2dbce5c29c319116.jpg)
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... |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/02/2012 09:30:41
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
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 |
|
|
 |
|
|