sábado, 23 de março de 2013

Utilizando Executors

Desde o Java 5 temos uma classe denominada java.util.concurrent.Executors. Esta classe permite gerar e gerenciar de uma forma mais fácil threads, que são o mecanismo básico (juntamente com socket) para nosso programa de chat no servidor.

Vamos ver como isto funciona.


sexta-feira, 22 de março de 2013

Ler o conteudo de um diretório utilizando DirectoryStream

Vamos ver mais uma classe de Java NIO - DirectoryStream.

Na verdade DirectoryStream não é uma classe, mas uma interface, isto quer dizer que ela não pode ser instanciada (não dá para usarmos o operador new) e sua função é de definir os métodos que devem ser implementados por outra classe que a estende (implementa).

No nosso caso, estamos utilizando Files.newDirectoryStream é uma factory que retorna um objeto que implementa esta interface. O Java implementa três versões deste método:
  • newDirectoryStream(Path):
    • abre o diretório especificado e permite varrer todas as suas entradas
    • o único parâmetro é um Path
  • newDirectoryStream(Path, DirectoryStream.Filter<>)
    • equivale ao primeiro caso, porém passamos também um filtro, que restringe a somente as entradas que passarem neste filtro.
  • newDirectoryStream(Path, String)
    • equivale ao segundo caso acima, porém o filtro é passado como uma String que deve possuir um formato do tipo GLOB.
Vamos a nossa classe:

terça-feira, 19 de março de 2013

Recursividade - Parte 2 ou MergeSort

O merge sort é um algoritmo de ordenação que utiliza recursividade em uma estratégia do tipo dividir-para-conquistar que consiste em
  • Dividir: o conjunto de dados em vários subconjuntos e ordenar esses subconjuntos através da recursividade, isto é, por divisão sucessiva até que o problema fique simples (veja no vídeo)
  • Conquistar: após todos os subconjuntos terem sido ordenados ocorre a união das resoluções em um subconjunto maior até que tenhamos todos o conjunto original ordenado.
No vídeo fica claro que a execução é feita em 3 passos:
  1. Dividir os dados em subconjuntos pequenos;
  2. Classificar as duas metades recursivamente aplicando o merge sort;
  3. Juntar as duas metades em um único conjunto já ordenado.



Como este algoritmo do Merge Sort usa a recursividade em alguns problemas esta técnica não é muito eficiente devido ao alto consumo de memória e tempo de execução. As principais recomendações para tornar este algoritmo mais eficiente são:
  • como o merge sort não é muito eficiente para pequenos conjuntos, devemos utilizar um outro método para subconjuntos com 10 ou menos elementos
  • verificar se o conjunto de dados já está ordenado
  • reduzir o tempo de ordenação eliminando a necessidade de cópia para a estrutura de dados auxiliar.
Vamos ver a nossa classe:


Você vai encontrar diversas informações úteis sobre este algoritmo no site do prof Sedgewick.