Métodos xxxListener() são implementados no Java utilizando threads?

3 respostas
Ferdinand

Olá,

gostaria de saber se os métodos do Java do tipo xxxxListener() são implementados nativamente utilizando multi-threads. Alguém pode me informar isso? Se não é em que seria?

3 Respostas

E

Não são implementados usando threads. Eles simplesmente são chamados na mesma thread da interface visual; e é por isso que você deve tomar cuidado ao implementar tais métodos. Se algum desses métodos tiver uma operação lenta mas que pode ficar rodando em segundo plano, essa operação deve ser delegada a uma thread separada.

Se você olhar o código do Java, vai ver que a implementação da chamada aos listeners é bem boboca - para cada componente, o Java simplesmente vai listando os listeners instalados para cada componente, e vai chamando um de cada vez (a sequência dessa chamada é dada pela sequência em que os listeners foram instalados, o que normalmente é algo difícil de determinar simplesmente inspecionando-se o programa.)

ViniGodoy

De maneira simples, a implementação dos listeners é assim:

public UmaClasseQualquer {
   public List<UmaClasseQualquerListener> listeners = new ArrayList<UmaClasseQualquerListener>();

   public void addListener(UmaClasseQualquerListener listener) {
      listeners.add(listener);
   }

   public void removeListener(UmaClasseQualquerListener listener) {
      listeners.remove(listener);
   }

   public void fireUmEventoQualquer() {
      UmEventoQualquer evento = new UmEventoQualquer(this);

      for (Listener listener : listeners) {
         listener.umEventoQualquer(evento);
      }
   }
}

Como você pode ver, nenhuma thread a mais é criada para adicionar, remover ou disparar eventos. Lançar um evento, aliás, é uma tarefa simples. Como o entaglement explicou consiste em basicamente varrer todos os listeners que estão salvos em uma lista, e chamar um de seus métodos.

Outra coisa. Algumas classes podem utilizar de outras estruturas, no lugar de uma lista, como o maps (LinkedHashMap ou mesmo o próprio HashMap). Isso é permitido pois diz o contrato do Java que os listeners não precisam ser notificados na ordem exata em que foram inseridos.

Ferdinand

Vlw. Brigadão … vou implementar então em uma thread serparada :smiley:

Criado 21 de abril de 2010
Ultima resposta 21 de abr. de 2010
Respostas 3
Participantes 3