Що робити процесами, які залишилися від тредів Java
Загалом у мене виникла проблема. Так склалося, що програма повинна запускатися кожну хвилину і жити близько 40 сек. Судячи з логів (логи надходять зі stdout у файл) додаток завершує роботу нормально і без помилок, АЛЕ! htop показує безліч процесів цієї програми. Як я розумію це процеси тредів. Причому помітив особливість, якщо я запускаю програму просто: java -jar /path/app.jar все нормально. Але якщо я додаю завдання в крон: * * * * * java -jar /path/app.jar То виникає таке лихо з потоками.
Код працює приблизно наступним обазом: 1. main створює екземпляр класу ThreadList і запускає метод .start() 2. TreadList отримує екземпляри класів та викликає
3. Клас Advert розширює Thread та виконує основну логіку. Якщо він виконується занадто довго, викликається виняток і викликає метод interrupt()
Підкажіть, через що можуть не завершуватися процеси потоків?
Кожен процес містить як мінімум одну тред, але не навпаки. Якщо ви не створювали процес навмисне, то треди створюються в контексті того самого процесу (у якому вони були запущені).
викликається виняток та викликає метод interrupt()
Це неправильно, потік має сам себе зупиняти.
Складається враження, ви якось неправильно крон налаштували, що він запускає багато інстанс програми, які не завершуються.
reus: спочатку я вас неправильно зрозумів (переплутав з Thread.stop(), який викликати і справді не рекомендується). Про interrupt() , він просто встановлює статус потоку "Тебе просять завершитися", сам потік і повинен його аналізувати ( if ( isInterrupted() ) return; ), інакше він не завершиться. Цей статус потрібен для того,щоб проводити виконання потоку ззовні. Якщо потік сам вирішив, що йому час, можна просто завершувати його run() і все.
Мабуть, так і виходить, що щохвилини у вас запускається програма знову і знову (ті самі процеси), а старий інстанс продовжує висіти на join'ах "вічних" потоків =)
Товстий Лоррі: А Ви не могли б навести приклад if (isInterrupted()) return; тобто потрібно зробити приблизно так?