Threads e IO Sérgio Luiz Ruivace Cerqueira [email protected] Roteiro • Processos X Threads • Ciclo de vida de uma Thread • Criação de uma Threads • Utilização de Threads • Sincronização de Threads © LES/PUC-Rio Processos X Threads • Processos – CPU virtual única e física compartilhada – Escalonador seleciona o processo a ser executado pelo CPU – Pode-se suspende-lo e reiniciá-lo a partir do mesmo ponto • Threads (lightweight process ) – Análoga ao processo – Uma thread é considerada leve pelo fato de rodar dentro do contexto do processo, – Compartilha os recursos alocados para o ambiente do programa Itens compartilhados © LES/PUC-Rio Estados © LES/PUC-Rio Criação de uma Threads • Existem duas estratégias básicas para usar Threads para criar uma aplicação concorrente: – Estendendo a classe Thread – Implementando a interface Runnable © LES/PUC-Rio Utilização de Threads • Considerações de Design • Usar a implementação do Runnable, dá maior flexibilidade de Design, pois permite que a classe que implementou a interface java.lang.Runnable estenda o comportamento de outra classe. • Estender diretamente a classe Thread, facilita o acesso aos métodos da classe java.lang.Thread, mas dificulta a modelagem da POO, pois impede que a sub-classe de Thread estenda outra classe. © LES/PUC-Rio Sincronização de Threads • Como as threads compartilham dados somos obrigados a nos preocupar com o que as outras threads estão fazendo em um ambiente multithreads • Existem várias formas de assegurar que o dados acessado pela thread seja sincronizado – Locking – NotifyAll e wait – Lock explícito e variáveis condicionais © LES/PUC-Rio Exemplo de lock reentrant • Saída © LES/PUC-Rio Garbage Collector • Nativo, variando de JVM para JVM – Algumas JVMs pagas oferecem serviço de limpeza de memória para poupar processamento e outros benefícios. • Quando ele roda – A JVM não o obriga a rodar, mas pode-se pedir não significa que ele vá rodar : – Ciclo de vida do objeto © LES/PUC-Rio Garbage Collector • Quando o garbage collector destrói objetos: – Quando estes não estão sendo referenciados por nenhuma variável. © LES/PUC-Rio I/O I/O • Java tem uma API extensa de manipulação de I/O • Permitindo a utilização da Console do SO e Arquivo • É possível ler e escrever em arquivo – Texto: FileWriter – Objeto: ObjectOutputStream – Etc... © LES/PUC-Rio Abrir File dir = new File("c:\\"); if (dir != null) { File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { System.out.println(files[i] + " => dir"); } else { System.out.println(files[i] + " => file"); } } } • Com a classe File é possível abrir o arquivo/diretório – Tendo acesso a lista de arquivo/diretório • Deve ser passado o endereço relativo ou absoluto do arquivo/diretório © LES/PUC-Rio Leitura BufferedReader inputStream = null; try { inputStream = new BufferedReader(new FileReader("c:\\teste.txt")); String line; while ((line = inputStream.readLine()) != null) { System.out.println(line); } } finally { try { if (inputStream != null) { inputStream.close(); } catch (Exeption e) { System.out.println(e.getMessage()); } } } • Com o BufferedReader é possível realizar a leitura do arquivo linha por linha • Ao trabalhar com leitura de arquivo é importante fechar o arquivo após a sua utilização © LES/PUC-Rio Escrita PrintWriter outputStream = null; try { outputStream = new PrintWriter(new FileWriter("c:\\teste.txt")); outputStream.println(“Linha de Teste"); } finally { if (outputStream != null) { outputStream.close(); } } • Com o PrintWriter é possível realizar a escrita de uma linha de String • Da mesma forma que na leitura de arquivo é importante fechar o arquivo após a sua utilização © LES/PUC-Rio Leitura do Teclado Scanner scan = null; try { scan = new Scanner(System.in); String linha = scan.nextLine(); int int1 = scan.nextInt(); float float1 = scan.nextFloat(); } catch(Exception e) { e.printStackTrace(); } finally { if (scan != null) scan.close(); } • Com o Scanner é possível obter informações enviadas pelo teclado • Ele já converte o texto escrito pelo teclado em um tipo a partir do método que você escolher – nextInt: vai converter o texto para int – nextDouble: vai converter o texto para double © LES/PUC-Rio Exercícios • O objetivo dos exercícios é fixar os conceitos de: – Ler um arquivo – Escrever em um arquivo – Ler do teclado 17 © LES/PUC-Rio Fim