Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667

Многопоточность. Как завершить неисполльзуемые потоки из главного потока

11.12.2014, 15:37. Показов 1976. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Буду рад любым идеям и замечаниям.
Пишу многопоточный сокет сервер.
Архитектура такая.
Есть форма. На форме кнопка.
Кнопка создает экземпляр класса AcceptServer в отдельном потоке.
Задача класса AcceptServer принимать подключения клиентов и создавать для каждого клиента при подключении экземпляр класса Server в отдельном потоке.(я знаю про nio и netty, не требуется).
Это кусочек из AcceptServer.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
....
ServerSocket s = null;
....
s = new ServerSocket(PORT);
...
while (true)
            {
                System.out.println("[AcceptServer] Ждёмс клиентов.");
                Socket socket = s.accept();
                String strInetAdr = socket.getInetAddress().toString(); //получаем ip клиента     
                System.out.println("[AcceptServer] Клиент подключается. IP" + strInetAdr);
                countConnection++;//инкремент количества подключений
                Server server = new Server(socket,strInetAdr,ProtocolData,Log,countConnection,CheckScroll);//тут создаю поток
...
            }
У созданного server есть и DataInputStream и DataOutputStream, в общем работает и туда и сюда.

БЛИЖЕ К ПРОБЛЕМЕ.
Дело в том что клиентами выступают ПЛК, тоесть некие устройства в которых не до конца реализованы сокеты.
Например в документации создания сокет-клиента на ПЛК говорится, что функция подключения к серверу вернет TRUE при удачном подключении или FALSE при неудачном подключении, но она всегда вовращает FALSE, тоесть отследить реально ли клиент подключен со стороны самого клиента только методом тыка - отправить пакет...

Так вот....
Этот клиент может несколько раз подключиться к JAVAServer'у, тоесть на каждое подключение создастся поток, но рабочий реально - это последний. Тоесть клиент не говорит о отключении, но при этом еще раз подключается к серверу, из-за чего накапливаются открытые подключения в отдельных потоках - и конечно это не хорошо.
Максимально принял меры со стороны клиента, но и в java хочу узнать как завершить поток.

1) У меня поток с классом server завершится при отключении клиента или по ошибке, а вот как завершить его из главного потока?
2) Гдето нужно хранить ссылки на потоки или назначать имена потокам?
3) Как выполнить метод в отдельном потоке, например нажав кнопку на форме?(юзаю swing)
4) Может использовать таймер обратного отсчета на уничножение потока скажем 1 минута, а если пришли\отправились данные, то таймер сбросился?
Хочется наиболее грамотно решить проблему.
Весь код конечно если нужно выложу, но там много опытов и грязи т.к. еще щупаю.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.12.2014, 15:37
Ответы с готовыми решениями:

Многопоточность: вызвать метод главного потока из второстепенного потока
Здравствуйте. Эта тема всеми избита, знаю. Но у меня очень ограничено время, поэтому рискую и пишу вопрос тут: Пишу приложение...

Многопоточность. Управление потоками из главного потока
Добра! Читал в интернете про потоки в Java и возник вопрос, например есть поток "player" и в нем воспроизводится аудиофайл ...

Как при завершении главного потока прерывать фоновые потоки?
При завершении главного потока фоновые прерываются. Как сделать?

2
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
11.12.2014, 17:51
1. Проще всего будет закрыть сокет. В том потоке вылетит исключение, его отловить и завершиться.
2. Как вам удобней. Создайте отдельный список, например. Имя задавать лучше перед стартом потока
3. Создать поток, в нем выполнить метод. Можно использовать SwingWorker для большего удобства работы с GUI
4. У сокета можно выставить таймаут. Если по истечению этого таймаута никто ничего не отправит - вылетит исключение и сокет закроется.
1
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
12.12.2014, 15:23  [ТС]
Спасибо, пункт 4 помог.
поставил socket.setSoTimeout(15000);//15 секунд
а потом ловлю SocketTimeoutException и в finally всё закрываю.
Всё оказалось проще чем я думал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.12.2014, 15:23
Помогаю со студенческими работами здесь

VC++6.0, как из порожденного потока прочитать переменную главного потока?
Visual C++ 6.0 SP5 Простое диалоговое окно, (MFC) созданное мастером среды VC По нажатию на кнопку создаю поражденный поток, в...

Как завершить определенные потоки по имени?
Еще раз добрый день господа! Помогите еще в одной проблеме, объясню проблему. Допустим работает 5 потоков, каждому потоку при запуске я...

Потоки. Как завершить поток через N sec?
Приветствую! Собственно, возникла проблема с завершением работы потока в котором задействован метод MyThread1. Перечитал уже тьму плюшек...

Как завершить выполнение потока
Делаю так: int btncnt = 0; private void button1_Click_1(object sender, EventArgs e) { if (btncnt == 0)...

Не получается с вторичного потока обратиться напрямую к объекту из главного потока
Добрый день. Проблема заключается в том что не могу в WPF с вторичного потока обратится на прямую к объекту из главного потока. WPF пока...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru