runnable

Mattepuffo's logo
Concorrenza in Java con Runnable

Concorrenza in Java con Runnable

Runnable è una interfaccia per Java che permette di impostare che una classe deve essere eseguita in thread.

Runnable ci permette di scrivere codice un pò più flessibile rispetto alla classe Thread.

Mattepuffo's logo
Usare i thread in Java con Executor Framework

Usare i thread in Java con Executor Framework

In Java, per creare un task, generalmente implementiamo l'interfacca Runnable o estendiamo la classe Thread.

Con le ultime versioni (non so precisamente da quale) è possibile agire anche in altra maniera, ovvero usando l'Executor Framework.

La classe Executors (da non confondere con l'interfaccia Executor) ci mette a disposizione tre metodi:

  • newCachedThreadPool(): crea un nuovo thread quando serve, ed usa la cache per velocizzarne l'eventuale riuso
  • newFixedThreadPool(int nThreads): il numero massimo di thread viene impostato come parametro
  • newSingleThreadExecutor(): un unico thread che esegue tutti i task; se "muore" viene ricreato

Andiamo a vedere semplice esempio.

Mattepuffo's logo
Catturare l'output di un comando in Java

Catturare l'output di un comando in Java

Quando lanciamo un comando da un nostro programma in Java (Swing), di default non ne vediamo l'output.

E il motivo è che, generalmente, viene mandato sullo standard output, che non è la interfaccia scritta in Java.

In molti casi, però, potrebbe essere importante catturare l'output, soprattutto per vedere a che punto siamo con la sua esecuzione.

Oggi vediamo proprio questo: come visualizzare l'output di un comando su una JTextArea.

Il programma che lanceremo sarà youtube-dl, programma da riga di comando per scaricare la musica in formato MP3 da Youtube.

Mattepuffo's logo
Monitorare il file system con Java

Monitorare il file system con Java

Finalmente vacanza, e finalmente posso dedicarmi di più al blog e alla programmazione per conto mio!

Oggi vediamo come monitorare il file system usando Java e il packaje NIO (incluso nel JDK ovviamente).

Qui potete leggere le differenze rispetto al più classico IO.

Partiamo dal main:

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchService;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;

public class Main {

    public static void main(String[] args) throws IOException, InterruptedException {
        Path folder = Paths.get("/path/to/dir");
        if (folder == null) {
            throw new UnsupportedOperationException("Directory not found");
        }
        WatchService ws = folder.getFileSystem().newWatchService();
        Watcher w = new Watcher(ws);
        Thread th = new Thread(w, "Watcher");
        th.start();
        folder.register(ws, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
        th.join();
    }

}

Come vedete usiamo praticamente solo classi e oggetti di NIO.

Mattepuffo's logo
Creare Timer con Java

Creare Timer con Java

Ho deciso di riscrivere da zero questo articolo, in quanto l'esempio precedente non mi piaceva granchè.

Quello che vediamo è sempre come usare i Timer in Java per temporizzare determinate operazioni.

Considerate che Timer ha diversi scheduler a disposizione, che potete vedere nella Javadoc.

Noi usiamo il metodo scheduleAtFixedRate, al quale passiamo:

  • un TimerTask
  • dopo quanto lanciare l'operazione la prima volta
  • ogni quanto ripetere l'operazione

Il TimerTask rappresenta appunto il nostro task, e può essere anche esteso da una nostra classe; ma qui vediamo un esempio più semplice.