Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Desafio: Executores | Mecanismos de Sincronização de Alto Nível
Multithreading em Java

bookDesafio: Executores

Tarefa

Imagine que você possui uma lista de arquivos, cada um contendo linhas de texto. Sua tarefa é ler as linhas desses arquivos em paralelo e contar o número de palavras em cada linha. Utilize ExecutorService, Future e um pool de threads para realizar a tarefa.

Requisitos:

  • Criar um pool de threads: Crie um pool de threads de tamanho fixo utilizando Executors.newFixedThreadPool(int nThreads), onde nThreads é o número de threads no pool;

  • Implementação da Tarefa: Implemente uma classe WordCountTask que implemente a interface Callable<String> e receba um arquivo como entrada. No método call dessa classe, leia as linhas do arquivo, conte o número de palavras em cada linha e retorne o resultado;

  • Uso do ExecutorService: Utilizando o ExecutorService, envie tarefas para o pool de threads para execução. As tarefas devem utilizar a classe WordCountTask.

Note
Nota

Além disso, a string que você formar em uma thread separada deve ser retornada e utilizada pelo método get() da interface Future para obter o resultado da execução da thread e exibir no console no método main.

Leitura de arquivo

Para implementar o método call(), utilize BufferedReader para ler strings de arquivos. Empregue um bloco try-with-resources para que os recursos sejam automaticamente fechados.

Main.java

Main.java

copy
1
BufferedReader reader = new BufferedReader(new FileReader(file));

Utilize o método readLine() para ler cada linha e certifique-se de verificar se o valor é null para determinar quando o final do arquivo foi alcançado.

Em seguida, divida a string em um array de strings utilizando o método split("\\s+") com o padrão \\s+, que separa a string por espaços, e então obtenha o tamanho do array.

Na própria string, que o stream retorna, utilize esta formatação

Main.java

Main.java

copy
1
String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)

Os arquivos já estão no projeto, não é necessário criá-los ou modificá-los!

Exemplo de saída

File: file1.txt | Line: Hello | Word Count: 1

File: file2.txt | Line: Hello I Love Java | Word Count: 4
File: file2.txt | Line: Lol Hello | Word Count: 2

File: file3.txt | Line: Java so so so so very nice | Word Count: 7
Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 7

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Awesome!

Completion rate improved to 3.33

bookDesafio: Executores

Deslize para mostrar o menu

Tarefa

Imagine que você possui uma lista de arquivos, cada um contendo linhas de texto. Sua tarefa é ler as linhas desses arquivos em paralelo e contar o número de palavras em cada linha. Utilize ExecutorService, Future e um pool de threads para realizar a tarefa.

Requisitos:

  • Criar um pool de threads: Crie um pool de threads de tamanho fixo utilizando Executors.newFixedThreadPool(int nThreads), onde nThreads é o número de threads no pool;

  • Implementação da Tarefa: Implemente uma classe WordCountTask que implemente a interface Callable<String> e receba um arquivo como entrada. No método call dessa classe, leia as linhas do arquivo, conte o número de palavras em cada linha e retorne o resultado;

  • Uso do ExecutorService: Utilizando o ExecutorService, envie tarefas para o pool de threads para execução. As tarefas devem utilizar a classe WordCountTask.

Note
Nota

Além disso, a string que você formar em uma thread separada deve ser retornada e utilizada pelo método get() da interface Future para obter o resultado da execução da thread e exibir no console no método main.

Leitura de arquivo

Para implementar o método call(), utilize BufferedReader para ler strings de arquivos. Empregue um bloco try-with-resources para que os recursos sejam automaticamente fechados.

Main.java

Main.java

copy
1
BufferedReader reader = new BufferedReader(new FileReader(file));

Utilize o método readLine() para ler cada linha e certifique-se de verificar se o valor é null para determinar quando o final do arquivo foi alcançado.

Em seguida, divida a string em um array de strings utilizando o método split("\\s+") com o padrão \\s+, que separa a string por espaços, e então obtenha o tamanho do array.

Na própria string, que o stream retorna, utilize esta formatação

Main.java

Main.java

copy
1
String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)

Os arquivos já estão no projeto, não é necessário criá-los ou modificá-los!

Exemplo de saída

File: file1.txt | Line: Hello | Word Count: 1

File: file2.txt | Line: Hello I Love Java | Word Count: 4
File: file2.txt | Line: Lol Hello | Word Count: 2

File: file3.txt | Line: Java so so so so very nice | Word Count: 7
Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 7
some-alt