|
|
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Подскажите как корректно закрыть один поток из нескольких? У меня есть приложение состоящее из основного фрэйма mainjFrame, в нем реализован поток: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. В этом потоке идет проверка сообщение от сервера и при определенной ситуации в панели вкладок создается закладка в которую грузится панел infojPanel. В infojPanel есть такая же реализация потока как и в mainjFrame. В infojPanel есть код (заключенный в потоке) который берет на себя обмен данными с сервером и отображает информацию в закладке. Проблема в то, что при закрытии закладки поток остается в памяти. Я попробовал решить задачу добавив флаг в infojPanel: Код: java 1. 2. Но после этого останавливается все приложение. Подскажите как правильно разрешить это проблему. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2012, 14:32:34 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
HunterNomad, Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2012, 16:58:11 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html Usage Example Here is a class with a method that sets up a ScheduledExecutorService to beep every ten seconds for an hour: import static java.util.concurrent.TimeUnit.*; class BeeperControl { private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public void beepForAnHour() { final Runnable beeper = new Runnable() { public void run() { System.out.println("beep"); } }; final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS); scheduler.schedule(new Runnable() { public void run() { beeperHandle.cancel(true); } }, 60 * 60, SECONDS); } } ... Since: 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2012, 17:12:43 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
cancel поможет только если таск запрограммирован с учетом что его можно стопнуть ) а то понапишут бесконечные циклы и удивляются чего не стопается) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2012, 17:22:22 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
ivanov-void http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html Usage Example Here is a class with a method that sets up a ScheduledExecutorService to beep every ten seconds for an hour: import static java.util.concurrent.TimeUnit.*; class BeeperControl { private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public void beepForAnHour() { final Runnable beeper = new Runnable() { public void run() { System.out.println("beep"); } }; final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS); scheduler.schedule(new Runnable() { public void run() { beeperHandle.cancel(true); } }, 60 * 60, SECONDS); } } ... Since: 1.5 Спасибо. Забыл добавить, что я переделываю чужой код. Как мне адаптировать Вашу версию решения пока не пойму. Но все равно спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2012, 20:24:15 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
HunterNomad, я так подозреваю, что cancel пошлет вашему потоку interrupt, само собой в вашем потоке должен быть корректно обработан InterruptedException. Правда всякие IO операции все равно будут висеть..по идее до победного ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 12:36:25 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
ОзверинПравда всякие IO операции все равно будут висеть..по идее до победного Че вдруг? Блокирующий IO выкидывает InterruptedException в большинстве случаев. Хотя, вроде, в теории, возможны варианты что не выкенет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 12:40:14 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
BlazkowiczОзверинПравда всякие IO операции все равно будут висеть..по идее до победного Че вдруг? Блокирующий IO выкидывает InterruptedException в большинстве случаев. Хотя, вроде, в теории, возможны варианты что не выкенет. Я не уверен, но stream`ы вроде неблокирующие..некоторые ;) Просто для заметки написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 12:45:17 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
BlazkowiczОзверинПравда всякие IO операции все равно будут висеть..по идее до победного Че вдруг? Блокирующий IO выкидывает InterruptedException в большинстве случаев. Хотя, вроде, в теории, возможны варианты что не выкенет. Точнее, блокирующие, но Noninterruptible blocking.(как то на ibm `е читал http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html в закладках оставил, справедливо ли для 1.6 - не знаю ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 12:47:20 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
ОзверинЯ не уверен, но stream`ы вроде неблокирующие..некоторые ;) Это какие? stream`ы, все блокирующие по природе своего API. Там не может быть бесконечно большого буфера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 12:47:54 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
BlazkowiczОзверинЯ не уверен, но stream`ы вроде неблокирующие..некоторые ;) Это какие? stream`ы, все блокирующие по природе своего API. Там не может быть бесконечно большого буфера. оговорился немного, см выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 12:49:10 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
Озвериноговорился немного, см выше. Да, я не прав. Вот тут пишут что сокеты на винде так не прерываются, поэтому лучше на это не закладываться вообще никогда. http://book.javanb.com/java-threads-3rd/jthreads3-CHP-12-SECT-3.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 12:54:27 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
Братцы!! Ну а мне как решить мой трабл? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 17:15:49 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
HunterNomadБратцы!! Ну а мне как решить мой трабл? Спасибо Клиентский сокет закрывайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2012, 17:29:29 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
BlazkowiczHunterNomadБратцы!! Ну а мне как решить мой трабл? Спасибо Клиентский сокет закрывайте. Работа с сокетами выведена в отдельный класс. И все методы после чтения или передачи данных закрывают за собой сокет. О как. Я уже думал переписать клиента так, чтобы поток работал только в mainjFrame и из него генерировалась добавление закладок и загрузка в них экземпляра infojPanel. И уже из главного из главного потока передавать данные по закладкам. Но увы, пока не решил как это реализовать. Может есть какие то библиотеки? Все равно спасибо, и спасибо Blazkowicz за инфу по пулу для работы с mysql. Переписал код сервера и теперь нагрузка на железо упала в разы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2012, 10:21:19 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
HunterNomadРабота с сокетами выведена в отдельный класс. Классы перпендекулярны потокам. HunterNomadИ все методы после чтения или передачи данных закрывают за собой сокет. О как. Нафига??? Тогда чем занимается поток, который нужно закрыть? Если сокет уже закрыт, то поток не может на нем висеть. Дамп потока, который нужно закрыть покажи, плз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2012, 10:23:39 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Условно говоря, приведу кусок листинга классов участвующих в этом: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: 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. Надеюсь это дает преставление о работе клиента. Почему я понял, что ThreadPoo не удаляется - я, после public void run() { поставил счетчик вводящий по +1 за цикл. Так вот, вывод производился даже после того, как я закрывал закладку с экземпляром infojPanel.java . Вод шас пришла мысль, а что если закрытие закладки не удаляет экземпляр infojPanel.java ? Это может служить причиной не закрытия потока? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2012, 13:47:32 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, хочу добавить, что я только переделываю чужой код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2012, 13:49:41 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
У нас в компании однажды пообещали увольнять за такое, без вопросов. Код: java 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2012, 13:52:42 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
HunterNomadВод шас пришла мысль, а что если закрытие закладки не удаляет экземпляр infojPanel.java ? Это может служить причиной не закрытия потока? Блин, странный ты. Сказали же, делаешь сначала interrupt() потоку - есть шанс что IO выкенет исключение и рантайм выйден из run(). Дальше закрываешь сокет, тогда logisticsReadingTheID не сможет ничего прочитать (разве что из буфера, но там всё равно будет проверка на CLOSED, так что и буфер читать не должно.) Тогда тоже будет исключение и рантайм выйдет из run() и поток завершится.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2012, 13:56:21 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
BlazkowiczУ нас в компании однажды пообещали увольнять за такое, без вопросов. Согласен, но мне до вашего уровня еще расти и расти. BlazkowiczHunterNomadВод шас пришла мысль, а что если закрытие закладки не удаляет экземпляр infojPanel.java ? Это может служить причиной не закрытия потока? Блин, странный ты. Сказали же, делаешь сначала interrupt() потоку - есть шанс что IO выкенет исключение и рантайм выйден из run(). Дальше закрываешь сокет, тогда logisticsReadingTheID не сможет ничего прочитать (разве что из буфера, но там всё равно будет проверка на CLOSED, так что и буфер читать не должно.) Тогда тоже будет исключение и рантайм выйдет из run() и поток завершится.. Ты наверное начала не читал. 1. есть основной фрэйма mainjFrame. В нем работает поток: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Вместо // реализация некоего кода - этот некий код дает запросы на сервер, ну и скажем если в базе появляется информация об ID=2 то он добавляет закладку в jTabbedPane и уже в этой закладке создается экземпляр infojPanel. В infojPanel есть похожий по коду поток(повторять не буду) вот он и в дальнейшем выводит инфу в закладке. Я и сам понимаю, что тут полная лажа, но просто хочу исправить (ну или хотя бы попробовать исправить) код для правильной работы, а не переписывать его полностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2012, 14:54:19 |
|
||
|
Как корректно закрыть один поток из нескольких
|
|||
|---|---|---|---|
|
#18+
HunterNomadТы наверное начала не читал. Я и сам понимаю, что тут полная лажа, но просто хочу исправить (ну или хотя бы попробовать исправить) код для правильной работы, а не переписывать его полностью. Уже третий раз перечитываю. Может кто-то не может объяснить? То проблема в том что поток в памяти. (это не удивительно, ведь у нас пул на один поток создан) То проблема в том что Future таск не останавливается. Ну, так уже ответили выше - cancel() используй. Сформулируй в чем конкретно проблема и почему ни одно из выше перечисленых решений тебе не подошло. Вместо этого ты сообщаешь кучу соврешенно не релевантной информации, которую я процитировал выше. Или давай так. Есть ScheduledFuture task. Он подписан на переодическое выполнение. Тогде при чем тут вообще остановока потока, если мы оперируем единицей Future. Вот подробно расписано по этому вопросу. http://stackoverflow.com/questions/9536555/utility-of-future-cancelboolean-method http://stackoverflow.com/questions/7269294/how-to-stop-a-runnable-scheduled-for-repeated-execution-after-a-certain-number-o ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2012, 15:06:29 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38000370&tid=2130761]: |
0ms |
get settings: |
11ms |
get forum list: |
24ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 281ms |
| total: | 465ms |

| 0 / 0 |
