Пул потоків
Базові технології Java /
Нитки та процеси
Здрастуйте, є програма, яку сам написав для створення та тестування пула потоків. Єдине, що залишилося зробити, це додати можливість скасовувати завдання по id, яке виконується. Мій варіант чомусь нічого не скасовує. Підкажіть, будь ласка, буду вдячний. Ось код пула:
а це тестуючий клас:
А власне чому він має щось зупиняти? FutureTask про ваш пул нічого навіть не підозрює. Що може зробити? Потрібно використовувати той Future, який повертається в результаті постановки завдання у Pool. Тобто. це ви повинні реалізувати таке Future, яке знає про ваш пул і вміє з ним правильно взаємодіяти (наприклад, переривати потрібний потік). Ось у цій реалізації можна успадкуватись від FutureTask.
Так, thread.stop() не просто так не рекомендований до використання. У документації навіть написано чому. Стандартним рішенням є Thread.interrupt() і правильна його обробка у всіх задачах, що перериваються.
І це вірно. Потрібно повідомити потоку, що "пора завершуватися". Після цього коректно опрацювати завершення. Як мінімум ці запити потрібно коректно обробляти в робочих потоках. Плюс ще цей запит можуть обробляти і завдання, вміючи завершуватися "швидше" при отриманні такого запиту. А те, що воно не працює – проблеми у коді.
При цьому воно створює різні витоку ресурсів на кшталт з'єднань до бази даних та файлових дескрипторів. Плюс може залишити дані у неконсистентному стані. Краще відразу відразу System.exit(2);
Ні, він викидає interrupted вираз. І тепер я бачу ще кілька проблем.