Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 72

Закрыть поток через ArrayList

31.07.2015, 02:56. Показов 1538. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, есть ArrayList в котором лежат объекты потоков. Пробегаясь по циклу, мне нужно закрыть нужный поток и удалить его из массива
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public InputStreamReader inStream;
 
if(Control._control.clientList.get(i).user_id.equals(user_id))
            {
            //Обрубаем ему соединение
                try {
                    Control._control.clientList.get(i).inStream.close();
                    Control._control.clientList.get(i).shutdown=true;
                    Control._control.clientList.get(i).s.close();//закрываем сокет
                    Control._control.clientList.get(i).s = null;
                    Control._control.clientList.remove(Control._control.clientList.get(i));
                    System.out.println(Control._control.clientList.get(i).myName + " отключился");
                } catch (IOException e) {
                    
                    e.printStackTrace();
                }
Но не выходит. Ошибок нет.
Java
1
inStream.close();
вот этот метод явно не срабатывает. Если закоментировать эти строки
Java
1
2
Control._control.clientList.get(i).inStream.close();
Control._control.clientList.remove(Control._control.clientList.get(i));
То криво, но отключается клиента, правда с ошибками Exception in thread "Thread-1".
Подскажите решение. Суть заключается в том, что если пользователь повторно хочет зайти через свой аккаунт(при этом предыдущий его аккаунт с теми же данными находится в сети), нужно обрубить соединение с первым потоком.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.07.2015, 02:56
Ответы с готовыми решениями:

Как правильно закрыть поток
Доброго времени суток. Не могу закрыть поток в методе. private static int intScaner() { BufferedReader in = new...

ArrayList через List
List<Integer> objTree = new ArrayList<>(); Я не понимаю смысла этой конструкции. List - это интерфейс. ArrayList - класс. Какой смысл...

Динамичный массив через arraylist
Почему не работает программа. И как можно сделать, чтобы он сначала добавил числа подходящие под условия в arraylist , а потом вывел бы...

20
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
31.07.2015, 15:48
1) shutdown это случайно не флаг, который может остановить прослушивание стрима?
2) с какими ошибками конкретно выходит если закоментить строки?
3) сама запись внушает ужас -это что статики с вложенными методами (Control._control.clientList.get(i).shut down)?
0
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 72
31.07.2015, 16:00  [ТС]
Exception in thread "Thread-1" java.lang.NullPointerException
at ClientThread.run(ClientThread.java:160)
at java.lang.Thread.run(Thread.java:745)

Welemir1,
-это что статики с вложенными методами (Control._control.clientList.get(i).shut down)?
shutdown это не метод, а public переменная типа boolean
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
31.07.2015, 16:23
Я вижу что это булин, я конкретно про него спросил
Цитата Сообщение от Welemir1 Посмотреть сообщение
1) shutdown это случайно не флаг, который может остановить прослушивание стрима?
(Control._control.clientList.get(i).shut down) -привел для примера количества точек, посмотри в Ютубе семинар Немчинского по написанию чистого кода.
0
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 72
31.07.2015, 16:25  [ТС]
Обязательно посмотрю. В общем я проверил, просто shutdown если поменять на true. Клиент отключается только после того, как он отправит последнее сообщение(на примере чата).
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
31.07.2015, 16:38
а попробуй объявить его volatile, то бишь volatile boolean shutdown;
или покажи код, где шатдаун используется непосредственно.
0
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 72
31.07.2015, 16:42  [ТС]
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
public void run() {
 
   
        while(s!=null){ //пока сокет "жив"                
                 try {
                    
                 
                        inStream =new InputStreamReader(s.getInputStream(),"UTF8");//входящий поток данных
                        outStream=new OutputStreamWriter(s.getOutputStream(),"UTF8");//исходящий поток
                        scanner=new Scanner(inStream);//слушем входящий поток
                        out=new PrintWriter(outStream,true);//создаем объект, который будет писать в исходящий поток
                        //Уведомляем всех пользователей, что к нам присоединился новый человек
                        Control._control.SendAll("К нам присоединился " + myName);
                        
                        
                        
                        while(!shutdown&&scanner.hasNextLine()){//если мы вручную не останавливаем сокет и есть сообщение
                            message=scanner.nextLine();//считываем его
                            
                            Control._control.SendAll(myName+": "+message);//просим Control разослать сообщение всем
                            System.out.println(myName +": " + message);
        
                            
              
                    }
                        
                        
                    } catch (IOException ex) {
                        System.out.println("Ошибка инициализации потоков:  "+ex.getMessage());
                    }finally{//при закрытии сокета
                       try {
                          
                          inStream.close();//закрываем входной поток
                          shutdown=true; 
                          s.close();//закрываем сокет
                          s=null;
                          Control._control.ShutdownClient(this,myName);//просим объект Control остановить нас
        
                          System.out.println(myName + " отключился");
                        } catch (IOException ex) {
                           System.out.println("Ошибка потока клиента:  "+ex.getMessage());
                        }
 
                    }
        }
    }
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
31.07.2015, 17:05
сделай шатдаун волатильным (volatile) и проверь
0
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 72
31.07.2015, 17:09  [ТС]
Не помогло.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
31.07.2015, 17:39
У вас же NPE, смотрите дебагом, какой объект вдруг стал Null'ом и почему его там нет.
0
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 72
31.07.2015, 21:00  [ТС]
Да и так понятно какой объект стал null-ом. Объект сокета, который дисконектим, вот его найти он и не может. Я сейчас не совсем пойму косяк.
Java
1
2
3
4
5
6
if(Control._control.clientList.get(i).user_id.equals(user_id))
            {
        
    Control._control.clientList.get(i).shutdown=true;
                
            }
Так то клиент обрубает, после следующего его сообщения, которое рассылается всем клиентам. Но я не пойму почему он может рассылать эти самые сообщения, ведь shutdown = true.
Вот этот блок отвечает за отправку
Java
1
2
3
4
5
6
7
8
9
while(!shutdown&&scanner.hasNextLine()){//если мы вручную не останавливаем сокет и есть сообщение
                            System.out.println(shutdown);
                            message=scanner.nextLine();//считываем его
                            Control._control.SendAll(myName+": "+message);//просим Control разослать сообщение всем
                            System.out.println(myName +": " + message);
        
                            
              
                    }
Но вот чудеса, условие выполняется, несмотря на то, что шотдаун тру. То есть в систем после рассылки исходя из строки
Java
1
System.out.println(shutdown);
он выдаёт true. Каким образом он выполнил эту часть кода?

Добавлено через 1 час 37 минут
Или обрубать сокет внутри клиента, отсылать ему идентифиактор нового подключившегося и если он совпадает с идентификатором клиента, то вызывать метод socket.close. Не знаю...
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
31.07.2015, 21:29
Очевидное решение -- воспользуйтесь дебагером и посмотрите, почему проходит условие. Потом посмотрите, что к приводит к такому состоянию.
0
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 72
31.07.2015, 22:48  [ТС]
Для меня дебагер - это консоль, в которой выводятся ошибки и необходимые указанные мною вещи. Я вывожу в консоль значение переменной shutdown, он показывает мне true после выполнения условия, а должен false, иначе бы условие не выполнилось. Что тут еще скажешь...
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
31.07.2015, 23:03
Цитата Сообщение от Godwarlock Посмотреть сообщение
Для меня дебагер - это консоль
Цитата Сообщение от Godwarlock Посмотреть сообщение
Что тут еще скажешь...
действительно....
Научитесь пользоваться дебагером, больше сказать нечего.
0
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 72
31.07.2015, 23:30  [ТС]
Дебагер ничего не выводит нужного. Всё вроде работает как надо, нигде не указывается об ошибках. Проблема явно в коде, но я не могу понять пока где именно
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
31.07.2015, 23:33
Godwarlock, вам выше советовали уже что конкретно смотреть в дебаге.

Цитата Сообщение от Godwarlock Посмотреть сообщение
нигде не указывается об ошибках
если бы указывалось, дебаг был бы ненужен
0
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 72
01.08.2015, 00:15  [ТС]
Смотрю. Вижу главный класс, какой-то DaemonThreads. Подключился клиент появился новая запись о Thread-1, подключился другой клиент, второй всё также висит, отправляем с основного клиента им сообщение, он пропадает из списка, коннект с ним прервался. Вот что я вижу.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
01.08.2015, 00:47
Цитата Сообщение от Godwarlock Посмотреть сообщение
Вот что я вижу.
надо не только смотреть, а ставить брейкпоинты и построчно смотреть выполнение каждой комманды. Думаю вам стоит прочитать как работать с отладчиком.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
01.08.2015, 02:46
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Думаю вам стоит прочитать как работать с отладчиком.
Кстати. Сейчас даже можно посмотреть обучающее видео на youtube.

Цитата Сообщение от Godwarlock Посмотреть сообщение
Для меня дебагер - это консоль, в которой выводятся ошибки и необходимые указанные мною вещи.
Это не дебаг, это логгирование. Так тоже можно найти причины ошибок, но сложнее.

Умение пользоваться дебагом -- одна из главных благодетелей программиста.

Дебаг позволяет выполнять команды по-одной, останавливать выполнение в установленных местах и смотреть состояние (переменных) в избранный момент.

Ставите брейкпоинт на условии, которое неправильно работает, находите, что стало этому причиной. При необходимости повторить.
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
01.08.2015, 07:35
Ошибка вот тут:
Java
1
2
while(!shutdown && scanner.hasNextLine()) {//если мы вручную не останавливаем сокет и есть сообщение
message=scanner.nextLine();//считываем его
Догадаешься почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.08.2015, 07:35
Помогаю со студенческими работами здесь

Среднее арифметическое через ArrayList
Пользователь вводит с клавиатуры число, а метод считает его среднее арифметическое, казалось бы все просто, но компилятор ругается, не знаю...

Поиск простых чисел через ArrayList
Здравствуйте. Подскажите, что с моим кодом не так, для поиска простых чисел. Он вроде работает на некоторые числа, но не на все. Например,...

Для чего написано: ArrayList<person> people = new ArrayList<>();
package com.company; import java.util.ArrayList; import java.util.Iterator; public class Main { public static void...

Передача ArrayList в качестве параметра методу, и в дальнейшем получение свойств объектов которые хранятся в ArrayList
Всем привет. Задача следующая: a. Есть классы Fruit -&gt; Apple, Orange;(больше фруктов не надо) b. Класс Box в который можно складывать...

Обращение к элементам ArrayList, который в другом ArrayList
Здравствуйте. У меня есть arraylist типа arraylist. А уже каждый внутренний arraylist типа JTextField. У JTextField (текстовое поле)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru