Удаление всех задач из очереди ThreadPoolExecutor

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

26
задан Malax 5 November 2009 в 10:16
поделиться

10 ответов

Рассматривали ли вы упаковку ExecutorService? Создайте

CleanShutdownExecutorService implements Executor 

, который делегирует все вызовы другому исполнителю, но сохраняет фьючерсы в своем собственном списке. CleanShutdownExecutorService может затем иметь метод cancelRemainingTasks (), который вызывает shutdown (), а затем вызывает cancel (false) для всех фьючерсов в своем списке.

10
ответ дан Sbodd 5 November 2009 в 10:16
поделиться
  • 1
    Это должно действительно быть принятым ответом, поскольку другие столкнутся с проблемами с большими файлами. – theduke 7 September 2016 в 08:45
  • 2
    Это должно действительно быть принятым ответом, поскольку другие столкнутся с проблемами с большими файлами. – theduke 7 September 2016 в 08:45
  • 3
    Это должно действительно быть принятым ответом, поскольку другие столкнутся с проблемами с большими файлами. – theduke 7 September 2016 в 08:45
  • 4
    Это должно действительно быть принятым ответом, поскольку другие столкнутся с проблемами с большими файлами. – theduke 7 September 2016 в 08:45
  • 5
    Это должно действительно быть принятым ответом, поскольку другие столкнутся с проблемами с большими файлами. – theduke 7 September 2016 в 08:45

Раньше я работал над приложением с длинными запущенными потоками. Мы делаем это при выключении,

BlockingQueue<Runnable> queue = threadPool.getQueue();
List<Runnable> list = new ArrayList<Runnable>();
int tasks = queue.drainTo(list);

Список сохраняется в файл. При запуске список добавляется обратно в пул, поэтому мы не теряем работу.

13
ответ дан Gray 5 November 2009 в 10:16
поделиться

Поскольку ExecutorService.shutdown () недостаточно, а ExecutorService.shutdownNow () делает слишком много, я думаю, вам нужно что-то написать в середине: запомните все свои представленные задачи и удалите их вручную после (или до) вызова shutdown().

4
ответ дан Bombe 5 November 2009 в 10:16
поделиться

Это старый вопрос, но в случае, если это поможет кому-то еще: вы можете установить энергозависимое логическое значение, когда вызываете shutdown (), и каждая отправленная задача завершается, если это логическое значение задано до реального запуска. Это позволит задачам, которые действительно начали завершаться, но не позволит задачам, находящимся в очереди, начать свою фактическую деятельность.

3
ответ дан Robert Tupelo-Schneck 5 November 2009 в 10:16
поделиться

Bombe ответит именно то, что вы хотите. shutdownNow() останавливает все, используя подход nuke and pave . Это лучшее, что вы можете сделать, если не учитывать реализацию ThreadPoolExecutor, которую вы используете.

1
ответ дан Max A. 5 November 2009 в 10:16
поделиться
  • 1
    Когда Вы говорите, что существует целое руководство, посвященное ему, необходимо также сказать нам, какое руководство это. – U. Windl 23 January 2018 в 15:26
  • 2
    Когда Вы говорите, что существует целое руководство, посвященное ему, необходимо также сказать нам, какое руководство это. – U. Windl 23 January 2018 в 15:26
  • 3
    Когда Вы говорите, что существует целое руководство, посвященное ему, необходимо также сказать нам, какое руководство это. – U. Windl 23 January 2018 в 15:26
  • 4
    Когда Вы говорите, что существует целое руководство, посвященное ему, необходимо также сказать нам, какое руководство это. – U. Windl 23 January 2018 в 15:26
  • 5
    Когда Вы говорите, что существует целое руководство, посвященное ему, необходимо также сказать нам, какое руководство это. – U. Windl 23 January 2018 в 15:26

Вы можете попробовать allowCoreThreadTimeOut(true);

1
ответ дан Shashank Kadne 5 November 2009 в 10:16
поделиться

Вы можете создать свою собственную очередь задач и передать ее конструктору ThreadPoolExecutor:

int poolSize = 1; // number of threads
BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>();
Executor executor = new ThreadPoolExecutor(poolSize, poolSize, 0L, TimeUnit.MILLISECONDS, queue);

Когда вы очищаете очередь где-то в вашем коде, остальные задачи не будут выполнены:

queue.clear();
1
ответ дан zenn1337 5 November 2009 в 10:16
поделиться
  • 1
    Вы don' t нужно для цикла вообще с тех пор you' ре, печатающее весь вектор. Всего print(linn) достаточен. – Assad Ebrahim 7 April 2014 в 04:41
  • 2
    Вы don' t нужно для цикла вообще с тех пор you' ре, печатающее весь вектор. Всего print(linn) достаточен. – Assad Ebrahim 7 April 2014 в 04:41
  • 3
    Вы don' t нужно для цикла вообще с тех пор you' ре, печатающее весь вектор. Всего print(linn) достаточен. – Assad Ebrahim 7 April 2014 в 04:41
  • 4
    Вы don' t нужно для цикла вообще с тех пор you' ре, печатающее весь вектор. Всего print(linn) достаточен. – Assad Ebrahim 7 April 2014 в 04:41
  • 5
    Вы don' t нужно для цикла вообще с тех пор you' ре, печатающее весь вектор. Всего print(linn) достаточен. – Assad Ebrahim 7 April 2014 в 04:41

Не работает awaitTermination(long timeout, TimeUnit unit) после выключения?

executor.shutdown (); executor.awaitTermination (60, TimeUnit.SECONDS)

0
ответ дан laura 5 November 2009 в 10:16
поделиться

Сумасшедшее и нечистое решение, которое может сработать (не совсем продуманно или протестировано), состоит в том, чтобы перезаписать interrupt() ваших WorkerTasks, которые только в том случае, если установлено какое-то глобальное значение, отказываются закрываться, когда к ним вызывается interrupt() by shutdownNow ().

Что должно позволить вам использовать shutdownNow() нет?

0
ответ дан jitter 5 November 2009 в 10:16
поделиться

Попросите ваш пул потоков завершить работу, getQueue, для каждого результата в отдельные Runnables, удалить каждый Runnable, используя метод remove. В зависимости от типа очереди, вы можете остановить удаление на ранней стадии на основе возвращаемых значений.

По сути, это захват очереди и ее очистка, только очистка с помощью методов, которые работают. Вместо того, чтобы вручную запоминать все представления, вы используете тот факт, что пул потоков уже должен запомнить все представления. Однако вам, вероятно, нужно будет сделать защитную копию очереди, поскольку я думаю, что это живое представление, и поэтому удаление, вероятно, вызовет исключение одновременной модификации, если вы выполняли итерацию / для каждого для живого представления.

0
ответ дан Carl 5 November 2009 в 10:16
поделиться
  • 1
    хорошо, что происходит, если у Вас есть файл на 30 ГБ? – Chris 19 October 2015 в 23:13
  • 2
    хорошо, что происходит, если у Вас есть файл на 30 ГБ? – Chris 19 October 2015 в 23:13
  • 3
    хорошо, что происходит, если у Вас есть файл на 30 ГБ? – Chris 19 October 2015 в 23:13
  • 4
    хорошо, что происходит, если у Вас есть файл на 30 ГБ? – Chris 19 October 2015 в 23:13
  • 5
    хорошо, что происходит, если у Вас есть файл на 30 ГБ? – Chris 19 October 2015 в 23:13
Другие вопросы по тегам:

Похожие вопросы: