ExecutorService que les interruptions de tâches après un délai d'attente

Je suis à la recherche d'un ExecutorService de mise en œuvre qui peut être fourni avec un délai d'attente. Les tâches qui sont soumis à l'ExecutorService sont interrompus si ils prennent plus de temps que le délai pour s'exécuter. L'application d'un tel engin n'est pas une tâche difficile, mais je me demandais si quelqu'un sait d'une mise en œuvre existantes.

Voici ce que j'ai trouvé basée sur quelques éléments de la discussion ci-dessous. Tous les commentaires?

import java.util.List;
import java.util.concurrent.*;
public class TimeoutThreadPoolExecutor extends ThreadPoolExecutor {
private final long timeout;
private final TimeUnit timeoutUnit;
private final ScheduledExecutorService timeoutExecutor = Executors.newSingleThreadScheduledExecutor();
private final ConcurrentMap<Runnable, ScheduledFuture> runningTasks = new ConcurrentHashMap<Runnable, ScheduledFuture>();
public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, long timeout, TimeUnit timeoutUnit) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
this.timeout = timeout;
this.timeoutUnit = timeoutUnit;
}
public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, long timeout, TimeUnit timeoutUnit) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
this.timeout = timeout;
this.timeoutUnit = timeoutUnit;
}
public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler, long timeout, TimeUnit timeoutUnit) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
this.timeout = timeout;
this.timeoutUnit = timeoutUnit;
}
public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler, long timeout, TimeUnit timeoutUnit) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
this.timeout = timeout;
this.timeoutUnit = timeoutUnit;
}
@Override
public void shutdown() {
timeoutExecutor.shutdown();
super.shutdown();
}
@Override
public List<Runnable> shutdownNow() {
timeoutExecutor.shutdownNow();
return super.shutdownNow();
}
@Override
protected void beforeExecute(Thread t, Runnable r) {
if(timeout > 0) {
final ScheduledFuture<?> scheduled = timeoutExecutor.schedule(new TimeoutTask(t), timeout, timeoutUnit);
runningTasks.put(r, scheduled);
}
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
ScheduledFuture timeoutTask = runningTasks.remove(r);
if(timeoutTask != null) {
timeoutTask.cancel(false);
}
}
class TimeoutTask implements Runnable {
private final Thread thread;
public TimeoutTask(Thread thread) {
this.thread = thread;
}
@Override
public void run() {
thread.interrupt();
}
}
}
  • Est que le début du délai d'attente au moment de la soumission? Ou le moment où le groupe commence à exécuter?
  • Bonne question. Quand il commence à exécuter. Sans doute à l'aide de la protected void beforeExecute(Thread t, Runnable r) crochet.
  • êtes-vous toujours à l'aide de cette solution ou a été remplacé
  • L'emploi où j'ai mis en place cette solution a été remplacé. 🙂
  • J'ai besoin exactement ça, sauf un) j'ai besoin de mon principal planificateur de service à un pool de threads avec un seul thread de service depuis besoin de mes tâches à exécuter strictement simultanément et b) j'ai besoin d'être en mesure de préciser le délai d'expiration de la durée de chaque tâche au moment où le groupe est soumis. J'ai essayé d'utiliser cela comme un point de départ, mais qui s'étend ScheduledThreadPoolExecutor, mais je ne vois pas un moyen d'obtenir la durée d'expiration spécifiée qui est à spécifier lors de la tâche de la soumission par le biais de la beforeExecute méthode. Toutes les suggestions grandement appréciée!
InformationsquelleAutor Edward Dale | 2010-05-03