Esecutore

Executor è l'interfaccia di base per le classi che implementa l'avvio di attività eseguibili . Ciò fornisce assistenza per l'aggiunta di un'attività e come avviarla.
ExecutorService è un'interfaccia che estende le proprietà di Executor e che descrive un servizio per l'esecuzione di attività eseguibili o richiamabili . I metodi submit accettano un'attività sotto forma di Callable o Runnable come input e Future viene utilizzato come valore di ritorno, attraverso il quale è possibile ottenere il risultato.
Il metodo invokeAll è responsabile dell'esecuzione delle attività, restituendo un elenco di attività con il relativo stato e i risultati di completamento.
Il metodo invokeAny è responsabile dell'esecuzione delle attività, restituendo il risultato di un'attività completata correttamente (ovvero senza generare un'eccezione), se presente.
ScheduledExecutorService : questa interfaccia aggiunge la possibilità di eseguire attività in sospeso con un certo ritardo o un certo periodo.
AbstractExecutorService è una classe astratta per la costruzione di un ExecutorService 'a. Al suo interno è presente un'implementazione dei metodi submit , invokeAll , invokeAny . Questa classe eredita ThreadPoolExecutor , ScheduledThreadPoolExecutor e ForkJoinPool .
public static void main(String[] args) {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
Callable<String> task = () -> {
System.out.println(Thread.currentThread().getName());
return Thread.currentThread().getName();
};
scheduledExecutorService.schedule(task, 10, TimeUnit.SECONDS);
scheduledExecutorService.shutdown();
}
ThreadPoolExecutor

Executors è una classe factory per la creazione di ThreadPoolExecutor , ScheduledThreadPoolExecutor . Se devi creare uno di questi pool, questa fabbrica è esattamente ciò di cui hai bisogno. Contiene diversi adattatori Runnable-Callable, PrivilegedAction-Callable, PrivilegedExceptionAction-Callable e altri. Dispone di metodi statici per la creazione di diversi ThreadPool .
ThreadPoolExecutor : implementa le interfacce Executor ed ExecutorService e separa la creazione dell'attività dall'esecuzione dell'attività. Dobbiamo implementare gli oggetti Runnable e inviarli all'esecutore, e ThreadPoolExecutor è responsabile della loro esecuzione, creazione di istanze e lavoro con i thread.
ScheduledThreadPoolExecutor : oltre ai metodi ThreadPoolExecutor , crea un pool di thread in grado di pianificare i comandi da eseguire dopo un determinato ritardo o per l'esecuzione periodica.
ThreadFactoryè un oggetto che crea nuovi thread su richiesta. Dobbiamo passare un'istanza al metodo Executors.newSingleThreadExecutor(ThreadFactory threadFactory) .
ExecutorService executorService = Executors.newSingleThreadExecutor(new ThreadFactory() {
@Override public Thread newThread(Runnable r) {
Thread thread = new Thread(r, "MyThread");
thread.setPriority(Thread.MAX_PRIORITY);
return thread; }
});
RejectedExecutionHandler : consente di definire un gestore per le attività che per qualche motivo non possono essere eseguite tramite ThreadPoolExecutor . Ciò accade quando non ci sono flussi gratuiti o il servizio viene interrotto o arrestato.
Diverse implementazioni standard si trovano nella classe ThreadPoolExecutor :
- CallerRunsPolicy: esegue un'attività sul thread chiamante;
- AbortPolicy: genera un'eccezione;
- DiscardPolicy - ignora l'attività;
- DiscardOldestPolicy: rimuove l'attività non avviata più vecchia dalla coda, quindi tenta di aggiungere nuovamente una nuova attività.
Servizio di completamento

CompletionService è un'interfaccia di servizio con disaccoppiamento tra l'avvio di attività asincrone e l'ottenimento di risultati. Per aggiungere attività, esiste un metododi invioe per ottenere i risultati di attività già completate, vengono utilizzati untakedi pollingnon bloccante.
ExecutorCompletionService è un wrapper su qualsiasi classe che implementa l'interfaccia Executor , ad esempio ThreadPoolExecutor o ForkJoinPool . Viene utilizzato quando è necessario astrarre dal metodo di avvio delle attività e controllarne l'esecuzione.
Se ci sono attività completate, le estraiamo. Se non ci sono compiti, restiamo in attesa finché qualcosa non è completato. Il servizio utilizza una LinkedBlockingQueue al suo interno, ma puoi passare qualsiasi implementazione di BlockingQueue.
GO TO FULL VERSION