Sfida: Executor
Compito
Immagina di avere un elenco di file, ognuno dei quali contiene righe di testo. Il tuo compito è leggere le righe da questi file in parallelo e contare il numero di parole in ciascuna riga. Utilizza ExecutorService, Future e un thread pool per svolgere il compito.
Requisiti:
-
Creazione di un thread pool: Crea un thread pool a dimensione fissa utilizzando
Executors.newFixedThreadPool(int nThreads), dovenThreadsè il numero di thread nel pool; -
Implementazione del task: Implementa una classe
WordCountTaskche implementa l'interfacciaCallable<String>e riceve un file come input. Nel metodo call di questa classe, leggi le righe dal file, conta il numero di parole in ciascuna riga e restituisci il risultato; -
Utilizzo di
ExecutorService: UtilizzandoExecutorService, invia i job al thread pool per l'esecuzione. I job devono utilizzare la classeWordCountTask.
Inoltre, la stringa che formi in un thread separato deve essere restituita e devi utilizzare il metodo get() dell'interfaccia Future per ottenere il risultato dell'esecuzione del thread e stamparlo sulla console nel metodo main.
Lettura da file
Per implementare il metodo call(), è possibile utilizzare BufferedReader per leggere stringhe dai file. Utilizzare un try-with-resources blocco affinché le risorse vengano chiuse automaticamente.
Main.java
1BufferedReader reader = new BufferedReader(new FileReader(file));
Utilizzare il metodo readLine() per leggere ogni riga, assicurandosi di controllare il valore null per determinare quando si è raggiunta la fine del file.
Successivamente, suddividere la stringa in un array di stringhe utilizzando il metodo split("\\s+") con il pattern \\s+, che separa la stringa in base agli spazi, e quindi ottenere la dimensione dell'array.
Nella stringa stessa, che lo stream restituisce, utilizzare questa formattazione
Main.java
1String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)
I file sono già presenti nel progetto, non è necessario crearli o modificarli!
Esempio di output
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
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Awesome!
Completion rate improved to 3.33
Sfida: Executor
Scorri per mostrare il menu
Compito
Immagina di avere un elenco di file, ognuno dei quali contiene righe di testo. Il tuo compito è leggere le righe da questi file in parallelo e contare il numero di parole in ciascuna riga. Utilizza ExecutorService, Future e un thread pool per svolgere il compito.
Requisiti:
-
Creazione di un thread pool: Crea un thread pool a dimensione fissa utilizzando
Executors.newFixedThreadPool(int nThreads), dovenThreadsè il numero di thread nel pool; -
Implementazione del task: Implementa una classe
WordCountTaskche implementa l'interfacciaCallable<String>e riceve un file come input. Nel metodo call di questa classe, leggi le righe dal file, conta il numero di parole in ciascuna riga e restituisci il risultato; -
Utilizzo di
ExecutorService: UtilizzandoExecutorService, invia i job al thread pool per l'esecuzione. I job devono utilizzare la classeWordCountTask.
Inoltre, la stringa che formi in un thread separato deve essere restituita e devi utilizzare il metodo get() dell'interfaccia Future per ottenere il risultato dell'esecuzione del thread e stamparlo sulla console nel metodo main.
Lettura da file
Per implementare il metodo call(), è possibile utilizzare BufferedReader per leggere stringhe dai file. Utilizzare un try-with-resources blocco affinché le risorse vengano chiuse automaticamente.
Main.java
1BufferedReader reader = new BufferedReader(new FileReader(file));
Utilizzare il metodo readLine() per leggere ogni riga, assicurandosi di controllare il valore null per determinare quando si è raggiunta la fine del file.
Successivamente, suddividere la stringa in un array di stringhe utilizzando il metodo split("\\s+") con il pattern \\s+, che separa la stringa in base agli spazi, e quindi ottenere la dimensione dell'array.
Nella stringa stessa, che lo stream restituisce, utilizzare questa formattazione
Main.java
1String.format("File: %s | Line: %s | Word Count %d", fileName, line, countWord)
I file sono già presenti nel progetto, non è necessario crearli o modificarli!
Esempio di output
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
Grazie per i tuoi commenti!