Desafio: 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), ondenThreadsé o número de threads no pool; -
Implementação da Tarefa: Implemente uma classe
WordCountTaskque implemente a interfaceCallable<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 oExecutorService, envie tarefas para o pool de threads para execução. As tarefas devem utilizar a classeWordCountTask.
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
1BufferedReader 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
1String.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
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Can you show me how to implement the WordCountTask class?
How do I use ExecutorService to run the WordCountTask for multiple files?
Can you explain how to format the output for each line as shown in the example?
Incrível!
Completion taxa melhorada para 3.33
Desafio: 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), ondenThreadsé o número de threads no pool; -
Implementação da Tarefa: Implemente uma classe
WordCountTaskque implemente a interfaceCallable<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 oExecutorService, envie tarefas para o pool de threads para execução. As tarefas devem utilizar a classeWordCountTask.
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
1BufferedReader 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
1String.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
Obrigado pelo seu feedback!