Défi : Exécuteurs
Tâche
Imaginez que vous disposez d'une liste de fichiers, chacun contenant des lignes de texte. Votre tâche consiste à lire les lignes de ces fichiers en parallèle et à compter le nombre de mots dans chaque ligne. Utilisez ExecutorService, Future et un pool de threads pour accomplir cette tâche.
Exigences :
-
Créer un pool de threads : Créez un pool de threads de taille fixe en utilisant
Executors.newFixedThreadPool(int nThreads), oùnThreadsest le nombre de threads dans le pool ; -
Implémentation de la tâche : Implémentez une classe
WordCountTaskqui implémente l'interfaceCallable<String>et reçoit un fichier en entrée. Dans la méthode call de cette classe, lisez les lignes du fichier, comptez le nombre de mots dans chaque ligne et retournez le résultat ; -
Utilisation de
ExecutorService: À l'aide deExecutorService, envoyez des tâches au pool de threads pour exécution. Les tâches doivent utiliser la classeWordCountTask.
De plus, la chaîne que vous formez dans un thread séparé doit être retournée et vous devez utiliser la méthode get() de l'interface Future pour obtenir le résultat de l'exécution du thread et l'afficher dans la méthode main.
Lecture depuis un fichier
Pour implémenter la méthode call(), il est possible d'utiliser BufferedReader afin de lire des chaînes depuis des fichiers. Employer un try-with-resources bloc pour que les ressources soient automatiquement fermées pour vous.
Main.java
1BufferedReader reader = new BufferedReader(new FileReader(file));
Utiliser la méthode readLine() pour lire chaque ligne, et vérifier la présence de null afin de déterminer la fin du fichier.
Ensuite, diviser la chaîne en un tableau de chaînes à l'aide de la méthode split("\\s+") avec le motif \\s+, qui sépare la chaîne par des espaces, puis obtenir la taille du tableau.
Dans la chaîne elle-même, que le flux retourne, utilisez ce formatage
Main.java
1String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)
Les fichiers sont déjà présents dans le projet, vous n'avez pas besoin de les créer ou de les modifier !
Exemple de sortie
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
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Awesome!
Completion rate improved to 3.33
Défi : Exécuteurs
Glissez pour afficher le menu
Tâche
Imaginez que vous disposez d'une liste de fichiers, chacun contenant des lignes de texte. Votre tâche consiste à lire les lignes de ces fichiers en parallèle et à compter le nombre de mots dans chaque ligne. Utilisez ExecutorService, Future et un pool de threads pour accomplir cette tâche.
Exigences :
-
Créer un pool de threads : Créez un pool de threads de taille fixe en utilisant
Executors.newFixedThreadPool(int nThreads), oùnThreadsest le nombre de threads dans le pool ; -
Implémentation de la tâche : Implémentez une classe
WordCountTaskqui implémente l'interfaceCallable<String>et reçoit un fichier en entrée. Dans la méthode call de cette classe, lisez les lignes du fichier, comptez le nombre de mots dans chaque ligne et retournez le résultat ; -
Utilisation de
ExecutorService: À l'aide deExecutorService, envoyez des tâches au pool de threads pour exécution. Les tâches doivent utiliser la classeWordCountTask.
De plus, la chaîne que vous formez dans un thread séparé doit être retournée et vous devez utiliser la méthode get() de l'interface Future pour obtenir le résultat de l'exécution du thread et l'afficher dans la méthode main.
Lecture depuis un fichier
Pour implémenter la méthode call(), il est possible d'utiliser BufferedReader afin de lire des chaînes depuis des fichiers. Employer un try-with-resources bloc pour que les ressources soient automatiquement fermées pour vous.
Main.java
1BufferedReader reader = new BufferedReader(new FileReader(file));
Utiliser la méthode readLine() pour lire chaque ligne, et vérifier la présence de null afin de déterminer la fin du fichier.
Ensuite, diviser la chaîne en un tableau de chaînes à l'aide de la méthode split("\\s+") avec le motif \\s+, qui sépare la chaîne par des espaces, puis obtenir la taille du tableau.
Dans la chaîne elle-même, que le flux retourne, utilisez ce formatage
Main.java
1String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)
Les fichiers sont déjà présents dans le projet, vous n'avez pas besoin de les créer ou de les modifier !
Exemple de sortie
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
Merci pour vos commentaires !