Ho un ScheduledThreadPoolExecutor con cui pianifico un'attività da eseguire a una velocità fissa. Voglio che l'attività sia in esecuzione con un ritardo specificato per un massimo di dire 10 volte finché non "riesce". Dopodiché, non voglio che l'attività venga ripetuta. Quindi in pratica ho bisogno di interrompere l'esecuzione dell'attività pianificata quando voglio che venga interrotta, ma senza chiudere ScheduledThreadPoolExecutor. Qualche idea su come lo farei?Come interrompere un'attività in ScheduledThreadPoolExecutor una volta che penso che sia completata
Ecco alcuni pseudo -
public class ScheduledThreadPoolExecutorTest
{
public static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(15); // no multiple instances, just one to serve all requests
class MyTask implements Runnable
{
private int MAX_ATTEMPTS = 10;
public void run()
{
if(++attempt <= MAX_ATTEMPTS)
{
doX();
if(doXSucceeded)
{
//stop retrying the task anymore
}
}
else
{
//couldn't succeed in MAX attempts, don't bother retrying anymore!
}
}
}
public void main(String[] args)
{
executor.scheduleAtFixedRate(new ScheduledThreadPoolExecutorTest().new MyTask(), 0, 5, TimeUnit.SECONDS);
}
}
Perfetto grazie! Sapevo del programmato, ma stavo cercando di usare questo modo: t = executor.scheduleAtFixedRate (new MyTask(), 0, 1, TimeUnit.SECONDS); t.cancel (true); che non avrebbe mai funzionato per ovvi motivi. Annullare l'attività all'interno dell'implementazione dell'attività sembra giusto. – mystarrocks
Grazie. Questo ha aiutato. È interessante notare che questo esempio non esce mai. Penso che sia necessario un arresto dell'esecutore – Kirby
O piuttosto è necessario un 't.get()' e un arresto dell'esecutore all'interno di un blocco catch di CancellationException – Kirby