Threads e MVC

14 respostas
V

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!

14 Respostas

oddy.silva

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.

V

oddy.silva:
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…

V

Estava lendo um tutorial de SwingWorker e achei interessante a minha única dúvida é como integrar Concorrência isso ao MVC…

vhmolinar

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…

V

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…

vhmolinar

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

V

hum…eh mas isso não vai acontecer porq a classe de controller sempre ficará ativa…

rdgms

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!

V

Agradeço as opniões :smiley: mas ainda essa parte de integração ainda está muito obscura para mim :cry:

rdgms

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!

V

rdgms:
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???..

V

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

V

alguém pode me indicar um bom tutorial de como se trabalha com threads e banco de dados???.. :slight_smile:

V

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);   
        }   
     }   
       
}
Criado 1 de julho de 2010
Ultima resposta 4 de jul. de 2010
Respostas 14
Participantes 4