|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
Всем привет! Задача такая: веб-приложение при старте должно запускать несколько процессов (заранее неизвестно сколько), которые должны шуршать в фоне. Делаю на грубом примере так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.
Все работает. Но потом делаем undeploy приложения, а файл все равно пишется. Похоже, что при андеплое приложения не приходим в contextDestroyed. Остановить можно только андеплой плюс рестарт веб-сервера. Возникает вопрос как сделать, чтобы "дочерний" поток прерывался при дисейбле/андеплое приложения на сервере. Переписываем в зародыш маленького ада: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
И каким-то чудом теперь все работает как требуется. Но хотелось бы понять, в чем фишка? Почему работает в данном случае как надо, только если лисенер сам себя засовывает в поток? (как понял, только в этом случае приходим в contextDestroyed). И возможно, как реализовать правильнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 19:27 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
"Веб-приложение" работает в сервлет-контейнер. Жизненный цикл сервлета предусматривает методы init() и destroy(). Метод destroy() должен выставить флаг "кончай работу" и любым способом контролировать число оставшихся в работе потоков Ваш(и) метод(ы) обязан(ы) регулярно проверять этот флаг, чтобы иметь возможность корректно завершаться без ударов киянкой по голове. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 19:50 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, это понятно. Но даже если вместо interrupt использовать флаг, который при выставлении в contextDestroyed выходит из цикла в методе run, поведение получается точно такое же (поток не останавливается при undeploy/disable). Понятно, что по флагу правильнее "мягче", но вопрос в том почему второй вариант работает и мы приходим в contextDestroyed, а первый нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 21:11 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSкаким-то чудом теперь все работает как требуется.про чудо потом. Ты скажи что он пишет в файл, если старший ушел с сервера? Может это и правильно, не вырубать его? Посреди работы? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 21:21 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, пишет ровно то, что в коде "Ку!". Вырубать его однозначно надо. По флагу или нет, вопрос не в этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 22:00 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSИ каким-то чудом теперь все работает как требуется. Но хотелось бы понять, в чем фишка? Почему работает в данном случае как надо, только если лисенер сам себя засовывает в поток? (как понял, только в этом случае приходим в contextDestroyed). И возможно, как реализовать правильнее? дружище ты никогда не станешь программистом нормальным если будешь задавать такие вопросы другими словами ты забиваешь свою голову тем,что тебе не нужно ) сделал - работает - расслабь булки и получай удовольствие ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 22:32 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSВырубать его однозначно надов оракле вырубается набором kill. Поэтому хороший поток кончить должен" (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 23:01 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
asv79, главное не купить билет на самолет, автопилот к которому сам же написал по такому принципу PetroNotC Sharp, про оракле не понял) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 07:57 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDS, В оракле и линуксе я кончаю поток набором kill в командной строке. Почему у тебя поток работает без бензина ты не рассказал. Может его изменить так чтобы он работал только под конкретную задачу, 1-10 сек. Приложение выгрузил (а не выдернул из розетки) и поток доделал свою задачу. Это вопрос чисто по постановке. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 08:12 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, в том и дело, что без бензина не надо работать (если это про ведущий поток). Да, можно завершить нормально без прерывания, но вопрос другой. Насчет кил операционкой "это же не наш метод" (с) ) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 08:57 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSчто без бензина не надо работать (если это про ведущий поток).у тебя не ведущий и не основной. На основном томкат сидит. Доп.поток создал ты сам. Почему он не заканчивает а крутится на бесконечном цикле? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 09:42 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDS, Пример. Сброс кэша в лог файл. Приложение закрыл, а в файл записывается и дескриптор закрывается. Почему у тебя не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 09:45 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, это понятно что сам. Например, он должен периодически проверять директорию на предмет появления там файлов, например, он должен держать коннект с другой прогой и тд. В общем этот поток должен работать пока работает основной (про основной томкат не будем, итак все время всторону уходим)). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 10:44 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDS Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
И возможно, как реализовать правильнее? У вас бесконечный цикл, который не заканчивается - добавил комментарий в то место, где ошибка. Правильнее было бы написать не while (true) а while (workingFlag) А в вызове contextDestroyed выставлять workingFlag = false и дожидаться через другой флаг того, что поток действительно завершился. Пишу упрощенно - "через флаг", но в действительности есть много классов для многопоточной работы и правильнее было бы через них, но это уже надо делать "во второй серии". Не забудьте на ваши "флаги" добавить ключевое слово volatile (ну или обрамить доступ к ним методами с synchronized) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:24 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
Натянуты твои задачи. Если они фоновые, то и делай отдельное приложение демон и старт, стоп. Если нет, то нефиг молотить операционку на предмет - есть ли изменения при простом деплое. ЛЮБОЙ СТАРТ ПРОГЕРА ДОЛЖЕН ИМЕТЬ СТОП В API. Да и приложение может быть развернуто вообще в докере где нет файловой системы и d: и с: JDS Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:33 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
qastaУ вас бесконечный циклда. Но он сопротивляется. В его API не предусмотрено СТОП)) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:34 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, ну елы-палы, ребят, я ж уже 4 раза сказал, что это просто пример и вопрос в другом Про флаг это понятно. Почему в первом случае не приходим в обработчик ondestroy, а во втором приходим) Ну не задавал же я вопрос про флаг и натянутость задачи). Да. Спросил, как сделать лучше, но в рамках примера (те поток шуршит все время пока жив породивший поток). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:39 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
qastaА в вызове contextDestroyedу него не вызывается. В этом вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:39 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC SharpqastaА в вызове contextDestroyedу него не вызывается. В этом вопрос. Вызывается, но только во втором варианте. Вопрос в том почему. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:40 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSPetroNotC Sharpпропущено... у него не вызывается. В этом вопрос. Вызывается, но только во втором варианте. Вопрос в том почему.убери для вопроса все лишнее вместе с классом. Вызывается? И ссылку сюда на доки. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:44 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
Наворотил кода по памяти, а пртом спрашивает почему не работает. А обычно пишут - написал, протестил. Написал, протестил. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 12:01 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, два простых примера, отражающие суть вопроса и не по памяти, а вполне протестированы. Если бы наворотил, то притащил бы сюда весь код) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 12:10 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSPetroNotC Sharpпропущено... у него не вызывается. В этом вопрос. Вызывается, но только во втором варианте. Вопрос в том почему. В вашем верхнем примере цикл никогда не закончится - ему наплевать на какие-то там флажки и прочее. Почему - я написал. Именно для того, чтобы поток нельзя было прервать где и когда захочется (эквивалент kill -9) и убрали метод Thead.stop(). Для прерывания в "заранее оговоренных местах" используются "флаги". Я вам написал, что надо сделать. Вы сделайте и протестируйте. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 12:29 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSотражающие суть вопросасуть ПРОГРАММИРОВАНИЯ в ПОСЛЕДОВАТЕЛЬНЫХ шагах. У вас из первого кода не следует второй кусок. Нужно первый кусок - рабочий и второй с ошибкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 12:31 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
qasta, вот хотел же написать пример с флагом, тк понимал, что возможно народ пойдет в эту сторону, но понадеялся, что обьясню, а зря :) Я же говорю, что и с флагом поведение ровно такое же, вопрос не в этом. PetroNotC Sharp, второй вариант, который работает как надо был получен методом тыка, поэтому конечно второй кусок не следует из первого. Различие в первом и втором примере очевидно, ну внутренняя суть не ясна: почему в 1 варианте не приходим в блок "финализации" сервлета. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 13:12 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDS, Ты долго будешь говорить или сделаешь то что тебя просят? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 13:38 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
Упрямому ТС .... Есть такой бородатый анекдот: Стоит новый русский около своего мерса, грустно так. Останавливается еще один: че, типа, стоишь? Да вот, сломалась — не едет. А стекла протирал? Протирал. А колеса пинал? Пинал. Ну тогда, братан, не знаю. Так вот, насчет "пинал". Дело было зимой. Было достаточно холодно. Бухгалтер нашей фирмы предложил подвезти меня до метро. Надо заметить, что бухгалтер он был классный, а вот в машинах разбирался весьма и весьма слабо. Завелись, прогрелись. Пытается тронуться — машины не едет. Не буксует, а именно не едет — колеса не крутятся. Минут через двадцать стараний из офиса нами обессилившими и замерзшими был вызван в помощь другой наш сотрудник Алексей, который с машиной, что называется "на ты". Что, говорит, машину сегодня мыл? Ну, мыл. Далее Алексей со всей силы бьет ногой по колесам. И, о чудо, машина трогается. Колеса-то после мойки примерзли. Так что в каждой шутке есть доля шутки. anekdotov.net ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 13:40 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC SharpJDS, Ты долго будешь говорить или сделаешь то что тебя просят? Пока, все что вижу, это: попробуй сделать с флагом, тк у тебя нет выхода из цикла. Еще упоминание про доку, но что именно не ясно. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 13:49 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSдокуестественно на событие. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 13:56 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC SharpJDSдокуестественно на событие. Ок, вечером поищу. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 14:03 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSPetroNotC Sharpпропущено... естественно на событие. Ок, вечером поищу.ok. Логирование без потока. Логи сюда. Доки сюда. И потом частями вставляем твой поток. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 14:30 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSqasta, вот хотел же написать пример с флагом, тк понимал, что возможно народ пойдет в эту сторону, но понадеялся, что обьясню, а зря :) Я же говорю, что и с флагом поведение ровно такое же, вопрос не в этом. В чем у вас вопрос? На "Но хотелось бы понять, в чем фишка?" вам уже ответили - у вас в первом коде из цикла выхода нет. На "как реализовать правильнее?" - вроде тоже ответили (через флаги с volatile & synchronized в простом варианте, через классы из java.util.concurrent - в сложном)... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 14:40 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
Все оказались правы как обычно. Не стал разбираться почему второй вариант работает, так как выглядит криво. А первый вариант действительно не работал так как если делать interrupt, когда поток спит, он падает на исключении "sleep interrupted" и из цикла не выходит, то есть помимо обработки исключения, туда надо втыкать break например. При этом даже с флагом ситуация не сильно спасает, если нет выхода из цикла в catch sleep-а, а мы выставляем флаг и тут же делаем interrupt. Вот если сначала выставить флаг, потом подождать больше чем слип внутри, то можно делать интеррапт, но смысла уже нет, т.к. из цикла итак вышли нормальным образом. Про синхронайзд, как понимаю, актуально, если переменную могут менять несколько потоков одновременно, но на вс случай можно воткнуть ) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 21:43 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSПро синхронайзд, как понимаю, актуально, если переменную могут менять несколько потоков одновременно, но на вс случай можно воткнуть ) Не только "меняют", но и "читают". То есть даже если переменную меняет только один поток, а читает другой - нужен synchronized или volatile. Иначе то будет работать, то не будет (самый неприятный вид ошибок). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2019, 12:53 |
|
|
start [/forum/topic.php?all=1&fid=59&tid=2121185]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
297ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 242ms |
total: | 646ms |
0 / 0 |