Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Desafío: Ejecutores | Mecanismos de Sincronización de Alto Nivel
Multithreading en Java

bookDesafío: Ejecutores

Tarea

Imagina que tienes una lista de archivos, cada uno de los cuales contiene líneas de texto. Tu tarea es leer las líneas de estos archivos en paralelo y contar el número de palabras en cada línea. Utiliza ExecutorService, Future y un pool de hilos para realizar la tarea.

Requisitos:

  • Crear un pool de hilos: Crea un pool de hilos de tamaño fijo utilizando Executors.newFixedThreadPool(int nThreads), donde nThreads es el número de hilos en el pool;

  • Implementación de la tarea: Implementa una clase WordCountTask que implemente la interfaz Callable<String> y reciba un archivo como entrada. En el método call de esta clase, lee las líneas del archivo, cuenta el número de palabras en cada línea y devuelve el resultado;

  • Uso de ExecutorService: Utilizando ExecutorService, envía trabajos al pool de hilos para su ejecución. Los trabajos deben utilizar la clase WordCountTask.

Note
Nota

Además, la cadena que formes en un hilo separado, debes devolverla y utilizar el método get() de la interfaz Future para obtener el resultado de la ejecución del hilo y mostrarlo en la consola en el método main.

Leer desde un archivo

Para implementar el método call(), se puede utilizar BufferedReader para leer cadenas desde archivos. Utilizar un try-with-resources bloque para que los recursos se cierren automáticamente.

Main.java

Main.java

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

Utilizar el método readLine() para leer cada línea, y asegurarse de comprobar si es null para determinar cuándo se ha llegado al final del archivo.

Luego, dividir la cadena en un arreglo de cadenas usando el método split("\\s+") con el patrón \\s+, que separa la cadena por espacios, y después obtener el tamaño del arreglo.

En la propia cadena, que devuelve el stream, utiliza este formato

Main.java

Main.java

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

¡Los archivos ya están en el proyecto, no necesitas crearlos ni modificarlos!

Salida de ejemplo

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
¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 7

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Suggested prompts:

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?

Awesome!

Completion rate improved to 3.33

bookDesafío: Ejecutores

Desliza para mostrar el menú

Tarea

Imagina que tienes una lista de archivos, cada uno de los cuales contiene líneas de texto. Tu tarea es leer las líneas de estos archivos en paralelo y contar el número de palabras en cada línea. Utiliza ExecutorService, Future y un pool de hilos para realizar la tarea.

Requisitos:

  • Crear un pool de hilos: Crea un pool de hilos de tamaño fijo utilizando Executors.newFixedThreadPool(int nThreads), donde nThreads es el número de hilos en el pool;

  • Implementación de la tarea: Implementa una clase WordCountTask que implemente la interfaz Callable<String> y reciba un archivo como entrada. En el método call de esta clase, lee las líneas del archivo, cuenta el número de palabras en cada línea y devuelve el resultado;

  • Uso de ExecutorService: Utilizando ExecutorService, envía trabajos al pool de hilos para su ejecución. Los trabajos deben utilizar la clase WordCountTask.

Note
Nota

Además, la cadena que formes en un hilo separado, debes devolverla y utilizar el método get() de la interfaz Future para obtener el resultado de la ejecución del hilo y mostrarlo en la consola en el método main.

Leer desde un archivo

Para implementar el método call(), se puede utilizar BufferedReader para leer cadenas desde archivos. Utilizar un try-with-resources bloque para que los recursos se cierren automáticamente.

Main.java

Main.java

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

Utilizar el método readLine() para leer cada línea, y asegurarse de comprobar si es null para determinar cuándo se ha llegado al final del archivo.

Luego, dividir la cadena en un arreglo de cadenas usando el método split("\\s+") con el patrón \\s+, que separa la cadena por espacios, y después obtener el tamaño del arreglo.

En la propia cadena, que devuelve el stream, utiliza este formato

Main.java

Main.java

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

¡Los archivos ya están en el proyecto, no necesitas crearlos ni modificarlos!

Salida de ejemplo

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
¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 7
some-alt