Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как корректно закрыть один поток из нескольких / 22 сообщений из 22, страница 1 из 1
14.10.2012, 14:32:34
    #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
14.10.2012, 16:58:11
    #37997623
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как корректно закрыть один поток из нескольких
HunterNomad,

Код: java
1.
2.
3.
...
ThreadPoo.cancel(true);
...
...
Рейтинг: 0 / 0
14.10.2012, 17:12:43
    #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
14.10.2012, 17:22:22
    #37997637
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как корректно закрыть один поток из нескольких
cancel поможет только если таск запрограммирован с учетом что его можно стопнуть ) а то понапишут бесконечные циклы и удивляются чего не стопается)
...
Рейтинг: 0 / 0
14.10.2012, 20:24:15
    #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
15.10.2012, 12:36:25
    #37998342
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как корректно закрыть один поток из нескольких
HunterNomad,

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

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

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

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

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

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

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

Нафига??? Тогда чем занимается поток, который нужно закрыть? Если сокет уже закрыт, то поток не может на нем висеть. Дамп потока, который нужно закрыть покажи, плз.
...
Рейтинг: 0 / 0
16.10.2012, 13:47:32
    #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
16.10.2012, 13:49:41
    #38000364
HunterNomad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как корректно закрыть один поток из нескольких
Blazkowicz, хочу добавить, что я только переделываю чужой код.
...
Рейтинг: 0 / 0
16.10.2012, 13:52:42
    #38000370
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как корректно закрыть один поток из нескольких
У нас в компании однажды пообещали увольнять за такое, без вопросов.
Код: java
1.
2.
catch (Exception ex) {
}
...
Рейтинг: 0 / 0
16.10.2012, 13:56:21
    #38000379
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как корректно закрыть один поток из нескольких
HunterNomadВод шас пришла мысль, а что если закрытие закладки не удаляет экземпляр infojPanel.java ? Это может служить причиной не закрытия потока?
Блин, странный ты. Сказали же, делаешь сначала interrupt() потоку - есть шанс что IO выкенет исключение и рантайм выйден из run(). Дальше закрываешь сокет, тогда logisticsReadingTheID не сможет ничего прочитать (разве что из буфера, но там всё равно будет проверка на CLOSED, так что и буфер читать не должно.) Тогда тоже будет исключение и рантайм выйдет из run() и поток завершится..
...
Рейтинг: 0 / 0
16.10.2012, 14:54:19
    #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
16.10.2012, 15:06:29
    #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
Форумы / Java [игнор отключен] [закрыт для гостей] / Как корректно закрыть один поток из нескольких / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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