Olá pessoal estou desenvolvendo um aplicativo em Desktop com Banco de Dados, decidi utilizar MVC pois gosto muito deste modelo e tb acho que ele se aplica melhor na minha aplicação…
Na minha aplicação eu terei que inserir um grande volume de registros no banco de dados e por isso decidir fazer isto em um Thread separada, a minha dúvida é como integrar Threads no meu modelo MVC, devo fazer a minha classe de controller implementar Runnable? ou devo criar uma classe separada para implementar a Thread?
Agradeço a quem puder me responder!
Threads e MVC
14 Respostas
Cara, não sei se você tá usando Hibernate, mas se tiver, dá uma olhada no padrão Thread-local Session.
Você vai gostar.
http://simoes.org/docs/hibernate-2.1/42.html
Tem mais coisas no Google. Eu aprendi a usar esse padrão lendo o Hibernate In Action, que fala bastante sobre ele, mas exemplifica mais com Servlets.
Cara, não sei se você tá usando Hibernate, mas se tiver, dá uma olhada no padrão Thread-local Session.
Você vai gostar.http://simoes.org/docs/hibernate-2.1/42.html
Tem mais coisas no Google. Eu aprendi a usar esse padrão lendo o Hibernate In Action, que fala bastante sobre ele, mas exemplifica mais com Servlets.
obrigado pela ajuda oddy.silva mas eu estou usando o MySQL msm sem integração com o hibernate…
Estava lendo um tutorial de SwingWorker e achei interessante a minha única dúvida é como integrar Concorrência isso ao MVC…
Em Java, threads são classes, então o que você vai precisar é ter uma classe separada à ser executada por uma thread e não fazer uma das camadas do MVC se tornar uma thread. Exemplo:
você teria uma classe runnable
public class InsertRegistersTask implements Runnable {
public void run() {
//inserts
}
}
que seria instanciada por uma thread
Thread worker = new Thread(new InsertRegistersTask(),"Thread de inserção de registros");
onde essa inicilização poderia ser feita em paralelo ao fluxo do MVC, por exemplo, quando sua aplicação inicializasse ou sei lá, a partir do momento que você preicsar que ela comece a funcionar…
Em Java, threads são classes, então o que você vai precisar é ter uma classe separada à ser executada por uma thread e não fazer uma das camadas do MVC se tornar uma thread. Exemplo:
você teria uma classe runnable
public class InsertRegistersTask implements Runnable {
public void run() {
//inserts
}
}
que seria instanciada por uma thread
Thread worker = new Thread(new InsertRegistersTask(),"Thread de inserção de registros");
onde essa inicilização poderia ser feita em paralelo ao fluxo do MVC, por exemplo, quando sua aplicação inicializasse ou sei lá, a partir do momento que você preicsar que ela comece a funcionar…
hum… ok isso eu entendo mas por exemplo a classe que vai executar a thread ele ficaria no pacote do controller???..
e mais uma dúvida se ela fosse uma classe privada dentro da minha classe Controller isso é uma boa prática de programação???..
obrigado pela ajuda…
Em Java, threads são classes, então o que você vai precisar é ter uma classe separada à ser executada por uma thread e não fazer uma das camadas do MVC se tornar uma thread. Exemplo:
você teria uma classe runnable
public class InsertRegistersTask implements Runnable {
public void run() {
//inserts
}
}
que seria instanciada por uma thread
Thread worker = new Thread(new InsertRegistersTask(),"Thread de inserção de registros");
onde essa inicilização poderia ser feita em paralelo ao fluxo do MVC, por exemplo, quando sua aplicação inicializasse ou sei lá, a partir do momento que você preicsar que ela comece a funcionar…
hum… ok isso eu entendo mas por exemplo a classe que vai executar a thread ele ficaria no pacote do controller???..
e mais uma dúvida se ela fosse uma classe privada dentro da minha classe Controller isso é uma boa prática de programação???..
obrigado pela ajuda…
Depende do que você entende por Modelo e Controle, mas tenho uma idéia de imediato de que não seria no controle não.
Agora sobre ser uma boa práticas ser uma inner class ou não, bom eu não sei, mas fico pensando no que poderia acontecer caso sua classe que engloba morresse e a thread ainda estivesse em execução. Taí uma boa questão.
Será que alguém aí sabe como java reageria a isso? hehe
hum…eh mas isso não vai acontecer porq a classe de controller sempre ficará ativa…
Você pode jogar os objetos na BlockingQueue… e depois consumir… em uma thread.
ai caso de algum problema você pode colocar esse objeto que deu erro em outra Queue
ai depois você ver qual a melhor maneira de tratar o problema
Abraço!
Agradeço as opniões
mas ainda essa parte de integração ainda está muito obscura para mim 
Você pode no controle ao invez de chamar o dao para já gravar o Objeto coloca em uma classe com uma blockingqueue… você criar uma thread para ficar consumindo essa fila!
Abraço!
Você pode no controle ao invez de chamar o dao para já gravar o Objeto coloca em uma classe com uma blockingqueue… você criar uma thread para ficar consumindo essa fila!Abraço!
hum…obrigado rdgms pela ajuda, onde posso encontrar um bom tutorial da clase blockingqueue???..
olá pessoal, tenho mais uma dúvida, o seguinte código é uma boa prática de programação???..
//tenho minha classe Controller(só um exemplo)
public class Controller implements ActionListener{
//aqui tenho a minha tarefa que eu quero que seja executada em outra thread
public void longTask {
//loop complicado
for(int i = 0; i < [telefone removido]; i++) {
//alguns processos
Thread.sleep(100);
}
}
//classe interna que vai executar a tarefa em outra thread
private class LongTaskThread implements Runnable {
public void run() {
//aqui eu chamo a minha tarefa
longTask();
}
}
//método de tratamento de eventos
public void actionPerformed(ActionEvent e) {
if(e.getSource() == buttonLongTask) {
//aqui eu executo a thread
Thread thread = new LongTaskThread();
thread.start();
}
}
}
o código acima é uma boa prática de programação???..
foi a forma mais apropriada que eu encontrei pra solucionar a minha dúvida que foi a responsável pela criação deste tópico…além da BlockingQueue que ja foi citada acima
alguém pode me indicar um bom tutorial de como se trabalha com threads e banco de dados???.. 
pessoal, a respeito da minha dúvida inicial, eu desenvolvi o código da minha aplicação que integra threads e mvc e postarei abaixo o código resumido da parte de integração de threads e mvc e gostaria da opnião de vocês para ver se o código está bem desenvolvido…
//My class Controller
public class Controller implements.... {
//my model
private MyModel model;
//my view
private MyView view;
public Controller() {
}
public void actionPeformed(ActionEvent e) {
//here I identify button event
if(e.getSource() == view.getBtnInsert()) {
//Here I instantiate the thread and run
Thread task = new DatabaseTask(...);
task.start();
}
}
//Here is my method that executes insertion in database
public void insertInDatabase(...) {
//Get DAO instance
MyDAO dao = new MyDAO();
dao.insert(...);
}
//Here is my class that creates and runs parallel thread
private class DatabaseTask extends Thread {
//Constructor default
public DatabaseTask() {
}
//Constructor that receive parameters to insert in the method insertInDatabase
public DatabaseTask(...) {
}
public void run() {
//Here I start my progress bar
view.getJProgressBar1().setIndeterminate(true);
//here I execute method insert
insertInDatabase(...);
//Here I finish my progress bar
view.getJProgressBar1().setIndeterminate(false);
}
}
}