SwingWorker e Observer

2 respostas
danilo.akamine

Pessoal,
tenho o seguinte código dentro de um actionPerformed(), então lembrando que tudo que está aqui será executado na thread da AWT.

SwingWorker a = new SwingWorker() {
  public Object doInBackground() {
    boolean resultado = modelo.salvar();
    return resultado;
  }

  public void done() {
    boolean resultado = (Boolean) get();
    if (resultado)
      JOptionPane.showMessageDialog(null, "salvo com sucesso");
    else
     JOptionPane.showMessageDialog(null, "erro ao salvar");
  }
}

Mas como estou utilizando SwingWorker, toda a regra de negócio dentro do doInBackground() será chamado em uma thread a parte, deixando a thread da AWT livre, que só será chamada novamente no método done(), até ai OK!
Mas e se eu estiver utilizando observadores dentro do método salvar() ?, por ex:

class Modelo extends Observable {
  public boolean salvar {
    boolean res = em.persist();
    atualizar();

    return res;
  }

  public void atualizar() {
    setChanged();
    notifyObservers();
  }
}

Sendo assim, a thread pararela vai chamar o método salvar(), que vai chamar o atualizar(), que vai chamar o notifyObservers() e vai invocar o método update() das janelas que estão observando-a.
e agora a dúvida, em que thread vai rodar o bloco de código dentro do update()? na thread pararela ou na thread da AWT?
ou vai rodar sempre na pararela e caso tenha algum comando que manipule a Janela, será delegado essa tarefa para thread AWT?
lembrando que após chamar o update() ele voltará para o doInBackground() e chamará o done(), desta vez já estando na thread AWT.

Ele funciona corretamente, mas não sei se estou "estragando" o SwingWorker.

Obrigado

2 Respostas

UMC

ae amigo edite seu post e coloque as tags de CODE para poder visualizar codigo melhor!!
vlw
abs

danilo.akamine

valeu, nao sabia dessa.

Criado 11 de dezembro de 2009
Ultima resposta 11 de dez. de 2009
Respostas 2
Participantes 2