Какво да правим с процесите, останали от нишките на Java
Общо взето имах проблем. Така се случи, че приложението трябва да работи всяка минута и да живее около 40 секунди. Съдейки по логовете (логовете идват от stdout към файла), приложението излиза нормално и без грешки, НО! htop показва многото процеси на това приложение. Доколкото разбирам, това са процеси на нишки. И забелязах една особеност, ако стартирам приложението просто: java -jar /path/app.jar тогава всичко е наред. Но ако добавя задача към cron: * * * * * java -jar /path/app.jar Тогава има такъв проблем с нишките.
Кодът работи по следния начин: 1. main създава екземпляр на класа ThreadList и изпълнява метода .start() 2. TreadList получава екземпляри и извиквания на класове
3. Класът Advert разширява Thread и изпълнява основната логика. Ако отнеме твърде много време, се хвърля изключение и извиква метода interrupt().
Подскажете от кои процеси на потоци не могат да завършат?
Всеки процес съдържа поне една нишка, но не и обратното. Ако не сте създали умишлено процес, тогава нишките се създават в контекста на същия процес (в който са стартирани).
хвърля се изключение и извиква метода interrupt().
Това е грешно, нишката трябва да спре сама.
Изглежда, че по някакъв начин сте конфигурирали cron неправилно, така че да стартира много екземпляри на приложения, които не се прекратяват.
reus: отначало те разбрах погрешно (объркан с Thread.stop(), което наистина не се препоръчва). Относно interrupt() , той просто задава състоянието на нишката „Помолени сте да прекратите“, самата нишка и трябва да я анализира ( if ( isInterrupted() ) return; ), в противен случай няма да прекрати. Това състояние е необходимо зада повлияе на изпълнението на резбата отвън. Ако самата нишка реши, че е време за това, тогава можете просто да завършите нейното изпълнение () и това е всичко.
Очевидно се оказва, че всяка минута стартирате програмата отново и отново (едни и същи процеси), а старият екземпляр продължава да виси на съединенията на "вечни" нишки =)
Fat Lorrie: Можете ли да дадете пример, ако ( isInterrupted() ) return; тоест трябва да направите нещо подобно?