Если вы действительно, действительно не хотите повторно реализовывать ScheduledThreadPoolExecutor
, тогда вы можете расширить его и переопределить все методы schedule*
и реализовать собственное ограничение задач.Это было бы довольно неприятно, хотя:
private final Object scheduleMonitor = new Object();
@Override
public ScheduledFuture<?> schedule(Runnable command,
long delay,
TimeUnit unit)
{
if (command == null || unit == null)
throw new NullPointerException();
synchronized (scheduleMonitor)
{
while (getQueue().size() >= MAX_QUEUE_SIZE)
{
scheduleMonitor.wait();
}
super.schedule(command, delay, unit);
}
}
@Override
Runnable getTask()
{
final Runnable r = getTask();
synchronized (scheduleMonitor)
{
scheduleMonitor.notify();
}
return r;
}
И повторить для:
public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit)
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit)
Обратите внимание, что это не помешает повторяющимся задачам превышать лимит очереди, оно будет блокировать только новые запланированные задачи.
Еще одно предостережение: я не проверяллюбые проблемы взаимоблокировки путем вызова super.schedule
при удержании блокировки на scheduleMonitor
...