powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как корректно закрыть один поток из нескольких
22 сообщений из 22, страница 1 из 1
Как корректно закрыть один поток из нескольких
    #37997533
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Подскажите как корректно закрыть один поток из нескольких?
У меня есть приложение состоящее из основного фрэйма mainjFrame, в нем реализован
поток:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
. . .
ScheduledExecutorService ThreadPoo = Executors.newScheduledThreadPool(1);
. . .
Runnable Runn = new Runnable() {
            @Override
            public void run() {
           ...
          // реализация некоего кода 
          }
 };
ThreadPoo.scheduleAtFixedRate(Runn, 0, 1, TimeUnit.SECONDS);


В этом потоке идет проверка сообщение от сервера и при определенной ситуации в панели вкладок создается закладка в которую грузится панел infojPanel.
В infojPanel есть такая же реализация потока как и в mainjFrame.
В infojPanel есть код (заключенный в потоке) который берет на себя обмен данными с сервером и отображает информацию в закладке.
Проблема в то, что при закрытии закладки поток остается в памяти.
Я попробовал решить задачу добавив флаг в infojPanel:
Код: java
1.
2.
// если закладка закрыта, то "прибить" поток
ThreadPoo.shutdown(); // эта строка с проверкой находится внутри run()


Но после этого останавливается все приложение.
Подскажите как правильно разрешить это проблему.

Заранее спасибо.
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37997623
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HunterNomad,

Код: java
1.
2.
3.
...
ThreadPoo.cancel(true);
...
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37997629
Фотография 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
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37997637
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cancel поможет только если таск запрограммирован с учетом что его можно стопнуть ) а то понапишут бесконечные циклы и удивляются чего не стопается)
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37997749
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

Спасибо.
Забыл добавить, что я переделываю чужой код. Как мне адаптировать Вашу версию решения пока не пойму. Но все равно спасибо.
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37998342
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HunterNomad,

я так подозреваю, что cancel пошлет вашему потоку interrupt, само собой в вашем потоке должен быть корректно обработан
InterruptedException. Правда всякие IO операции все равно будут висеть..по идее до победного
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37998350
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинПравда всякие IO операции все равно будут висеть..по идее до победного
Че вдруг? Блокирующий IO выкидывает InterruptedException в большинстве случаев. Хотя, вроде, в теории, возможны варианты что не выкенет.
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37998367
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczОзверинПравда всякие IO операции все равно будут висеть..по идее до победного
Че вдруг? Блокирующий IO выкидывает InterruptedException в большинстве случаев. Хотя, вроде, в теории, возможны варианты что не выкенет.

Я не уверен, но stream`ы вроде неблокирующие..некоторые ;) Просто для заметки написал.
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37998370
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczОзверинПравда всякие IO операции все равно будут висеть..по идее до победного
Че вдруг? Блокирующий IO выкидывает InterruptedException в большинстве случаев. Хотя, вроде, в теории, возможны варианты что не выкенет.

Точнее, блокирующие, но Noninterruptible blocking.(как то на ibm `е читал http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html в закладках оставил, справедливо ли для 1.6 - не знаю ;)
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37998373
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинЯ не уверен, но stream`ы вроде неблокирующие..некоторые ;)
Это какие? stream`ы, все блокирующие по природе своего API. Там не может быть бесконечно большого буфера.
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37998379
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczОзверинЯ не уверен, но stream`ы вроде неблокирующие..некоторые ;)
Это какие? stream`ы, все блокирующие по природе своего API. Там не может быть бесконечно большого буфера.

оговорился немного, см выше.
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37998397
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озвериноговорился немного, см выше.
Да, я не прав.
Вот тут пишут что сокеты на винде так не прерываются, поэтому лучше на это не закладываться вообще никогда.
http://book.javanb.com/java-threads-3rd/jthreads3-CHP-12-SECT-3.html
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37999006
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Братцы!!
Ну а мне как решить мой трабл?
Спасибо
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37999044
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HunterNomadБратцы!!
Ну а мне как решить мой трабл?
Спасибо
Клиентский сокет закрывайте.
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37999812
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczHunterNomadБратцы!!
Ну а мне как решить мой трабл?
Спасибо
Клиентский сокет закрывайте.
Работа с сокетами выведена в отдельный класс.
И все методы после чтения или передачи данных закрывают за собой сокет.
О как.
Я уже думал переписать клиента так, чтобы поток работал только в mainjFrame
и из него генерировалась добавление закладок и загрузка в них экземпляра infojPanel.
И уже из главного из главного потока передавать данные по закладкам.
Но увы, пока не решил как это реализовать.
Может есть какие то библиотеки?

Все равно спасибо, и спасибо Blazkowicz за инфу по пулу для работы с mysql. Переписал код сервера и теперь нагрузка на железо упала в разы.
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #37999818
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HunterNomadРабота с сокетами выведена в отдельный класс.

Классы перпендекулярны потокам.

HunterNomadИ все методы после чтения или передачи данных закрывают за собой сокет.
О как.

Нафига??? Тогда чем занимается поток, который нужно закрыть? Если сокет уже закрыт, то поток не может на нем висеть. Дамп потока, который нужно закрыть покажи, плз.
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #38000356
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
Условно говоря, приведу кусок листинга классов участвующих в этом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
//clientSock.java
. . .
public String logisticsReadingTheID(String id) throws IOException {
        sock = new Socket(hostName, 1234);
        is = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        os = new PrintWriter(sock.getOutputStream(), true);
        os.print("logisticsReadingTheID|||" + id);
        os.flush();
        String ret = is.readLine();
        sock.close();
        return ret;
}
. . .



Код: 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.
//infojPanel.java

. . .
ScheduledExecutorService ThreadPoo = Executors.newScheduledThreadPool(1);

	    Runnable Runn = new Runnable() {
            clientSock cs = new clientSock();
	    String logisticsReadingTheID;
            @Override
            public void run() {
                try {
                        logisticsReadingTheID = cs.logisticsReadingTheID(String id);
                        StringTokenizer tokenizerstrMSG = new StringTokenizer(strMSG, "|||");
                        while (tokenizerstrMSG.hasMoreTokens()) {
                            String from = tokenizerstrMSG.nextToken();
                            String to = tokenizerstrMSG.nextToken();
                            String str = from + " " + to +"\n";
                            jTextArea1.append(str);
                        }
                    }
                } catch (Exception ex) {
               }
            }
        };

        ThreadPoo.scheduleAtFixedRate(Runn, 0, 1, TimeUnit.SECONDS);
. . .



Надеюсь это дает преставление о работе клиента.
Почему я понял, что ThreadPoo не удаляется - я, после public void run() { поставил счетчик вводящий по +1 за цикл. Так вот, вывод производился даже после того, как я закрывал закладку с экземпляром infojPanel.java .
Вод шас пришла мысль, а что если закрытие закладки не удаляет экземпляр infojPanel.java ? Это может служить причиной не закрытия потока?
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #38000364
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, хочу добавить, что я только переделываю чужой код.
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #38000370
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас в компании однажды пообещали увольнять за такое, без вопросов.
Код: java
1.
2.
catch (Exception ex) {
}
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #38000379
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HunterNomadВод шас пришла мысль, а что если закрытие закладки не удаляет экземпляр infojPanel.java ? Это может служить причиной не закрытия потока?
Блин, странный ты. Сказали же, делаешь сначала interrupt() потоку - есть шанс что IO выкенет исключение и рантайм выйден из run(). Дальше закрываешь сокет, тогда logisticsReadingTheID не сможет ничего прочитать (разве что из буфера, но там всё равно будет проверка на CLOSED, так что и буфер читать не должно.) Тогда тоже будет исключение и рантайм выйдет из run() и поток завершится..
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #38000540
HunterNomad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczУ нас в компании однажды пообещали увольнять за такое, без вопросов.
Согласен, но мне до вашего уровня еще расти и расти.

BlazkowiczHunterNomadВод шас пришла мысль, а что если закрытие закладки не удаляет экземпляр infojPanel.java ? Это может служить причиной не закрытия потока?
Блин, странный ты. Сказали же, делаешь сначала interrupt() потоку - есть шанс что IO выкенет исключение и рантайм выйден из run(). Дальше закрываешь сокет, тогда logisticsReadingTheID не сможет ничего прочитать (разве что из буфера, но там всё равно будет проверка на CLOSED, так что и буфер читать не должно.) Тогда тоже будет исключение и рантайм выйдет из run() и поток завершится..
Ты наверное начала не читал.
1. есть основной фрэйма mainjFrame. В нем работает поток:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ScheduledExecutorService ThreadPoo = Executors.newScheduledThreadPool(1);
. . .
Runnable Runn = new Runnable() {
            @Override
            public void run() {
           ...
          // реализация некоего кода 
          }
 };
ThreadPoo.scheduleAtFixedRate(Runn, 0, 1, TimeUnit.SECONDS);


Вместо // реализация некоего кода - этот некий код дает запросы на сервер, ну и скажем если в базе появляется информация об ID=2 то он добавляет закладку в jTabbedPane и уже в этой закладке создается экземпляр infojPanel. В infojPanel есть похожий по коду поток(повторять не буду) вот он и в дальнейшем выводит инфу в закладке.

Я и сам понимаю, что тут полная лажа, но просто хочу исправить (ну или хотя бы попробовать исправить) код для правильной работы, а не переписывать его полностью.
...
Рейтинг: 0 / 0
Как корректно закрыть один поток из нескольких
    #38000575
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как корректно закрыть один поток из нескольких
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]