У меня есть ExecutorService
, для которого я отправляю задачи:
private final ExecutorService CUSTOM_POOL = Executors
.newCachedThreadPool();
private Queue<Future<?>> customTasksHandles;
private boolean started;
private Runnable task = new Runnable() {
@Override
public void run() {
if (!started) {return;}
...
customTasksHandles.add(CUSTOM_POOL.submit(new CustomTask(customData)));
...
}
}
Мне нужно создать функции public void stop()
и public void start()
. Функция stop()
будет future.cancel()
для каждой задачи, которая была отправлена исполнителю, тогда как start()
снова начнет запускать task
Runnable
.
public void stop() {
...
Future customTasksHandle= customTasksHandles.poll();
while (customTasksHandle!=null) {
customTasksHandle.cancel(true);
customTasksHandle=locationTasksHandles.poll();
}
...
started = false;
}
public void start() {started = true;}
Я пытался простоCUSTOM_POOL.shutdown()
, однако, кажется, что невозможно представить новые задачи позже, после вызова start()
. Кажется, что единственный способ - перебрать все отправленные задачи и вызвать .cancel()
для каждой.
Однако как получить все отправленные задачи, не добавляя каждую задачу в список / очередь при отправке? Есть ли лучший способ сделать это, кроме как выше? Я надеялся на метод List<Future> submittedTasks = CUSTOM_POOL.getAllSubmittedTasks()
, но, похоже, его нет. Интересно, что методы .shutdown()
и invoke()
возвращают List<Future>
, но имеют побочные эффекты.