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.
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.
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:
Andiamo a vedere semplice esempio.
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.
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.
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:
Il TimerTask rappresenta appunto il nostro task, e può essere anche esteso da una nostra classe; ma qui vediamo un esempio più semplice.