C'è un modo semplice per dire a quali compiti un Esecutore Java è in esecuzione in un dato momento?
-
25-09-2019 - |
Domanda
Sono sicuro che avrei potuto incidere qualcosa insieme che mi avrebbe permesso di capire questo, ma spero ci sia una soluzione out-of-the-box mi manca solo. Ho letto i documenti, ma non ho visto nulla.
La mia specifica applicazione sta usando una ThreadPoolExecutor
sostenuta da un DelayQueue
, anche se non sono sicuro che le cose.
Grazie!
Soluzione
Non credo ci sia un modo affidabile per fare questo. Se si desidera che conta ci sono metodi disponibili (getTaskCount () / getCompletedTaskCount ()), che di aiuto. Se avete bisogno i compiti effettivi poi per quanto ne so è necessario manualmente per tenere traccia delle attività, sovrascrivendo BeforeExecute () e afterExecute () è un modo.
Altri suggerimenti
Un approccio semplice: avvolgere le attività con il codice che chiamerà callback inizio di nuova attività di segnalazione, passando lungo tutti i dati che si vuole a:
interface StartTaskWatcher {
void taskStarted(Object data);
}
class StartTaskSignalingWrapper implements Runnable {
private final Runnable task;
private final String taskDescription;
private final StartTaskWatcher startTaskWatcher;
StartTaskSignalingWrapper(Runnable task, String taskDescription, StartTaskWatcher startTaskWatcher) {
this.task = task;
this.taskDescription = taskDescription;
this.startTaskWatcher = startTaskWatcher;
}
public void run() {
startTaskWatcher.taskStarted(taskDescription);
task.run();
}
}
Avete veramente bisogno di sapere in fase di esecuzione, o semplicemente per il debug?
Se sei solo il debug, prendere in considerazione uno sguardo alla applicazione jvisualvm (installata nella directory 'bin' del JDK). Esso consente di ispezionare in modo dinamico tutti i thread in esecuzione, quindi dovrebbe essere in grado di fornire con una certa comprensione.
(La jvisualvm può anche eseguire CPU / memoria profilatura, con esecuzione e assegnazione hotspot, e l'attività di raccolta spettacoli rifiuti in tempo reale.)