Desafí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), dondenThreadses el número de hilos en el pool; -
Implementación de la tarea: Implementa una clase
WordCountTaskque implemente la interfazCallable<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: UtilizandoExecutorService, envía trabajos al pool de hilos para su ejecución. Los trabajos deben utilizar la claseWordCountTask.
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
1BufferedReader 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
1String.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
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
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
Desafí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), dondenThreadses el número de hilos en el pool; -
Implementación de la tarea: Implementa una clase
WordCountTaskque implemente la interfazCallable<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: UtilizandoExecutorService, envía trabajos al pool de hilos para su ejecución. Los trabajos deben utilizar la claseWordCountTask.
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
1BufferedReader 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
1String.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
¡Gracias por tus comentarios!