Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Sfida: Executor | Meccanismi di Sincronizzazione di Alto Livello
Multithreading in Java

bookSfida: 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), dove nThreads è il numero di thread nel pool;

  • Implementazione del task: Implementa una classe WordCountTask che implementa l'interfaccia Callable<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: Utilizzando ExecutorService, invia i job al thread pool per l'esecuzione. I job devono utilizzare la classe WordCountTask.

Note
Nota

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

Main.java

copy
1
BufferedReader 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

Main.java

copy
1
String.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
Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 7

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Awesome!

Completion rate improved to 3.33

bookSfida: 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), dove nThreads è il numero di thread nel pool;

  • Implementazione del task: Implementa una classe WordCountTask che implementa l'interfaccia Callable<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: Utilizzando ExecutorService, invia i job al thread pool per l'esecuzione. I job devono utilizzare la classe WordCountTask.

Note
Nota

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

Main.java

copy
1
BufferedReader 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

Main.java

copy
1
String.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
Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 7
some-alt