Многопоточное соединение делает систему нестабильной - PullRequest
0 голосов
/ 18 марта 2012

Друзья

Я создаю JAVA TCP-прослушиватель, где он может обрабатывать 6000 входящих запросов одновременно. Я создаю соединение через сокет и принимаю данные. После принятия данных я выполняю некоторую операцию над ним, создавая поток, но я не убиваю этот поток, поскольку устройство будет отправлять данные каждые две минуты, поэтому я только создаю поток в спящий режим на 30 секунд.

Но после запуска системы в течение пяти минут, мое приложение, которое работает под tomcat6.0, выдает ошибку: «Кажется, веб-приложение запустило поток с именем [Thread-214], но не смогло его остановить. Это очень вероятно создать утечку памяти. "

Пожалуйста, помогите мне понять, где я делаю неправильно?

Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 18 марта 2012

Если у вас много сокетов, вместо использования потока на канал.Попробуйте использовать один поток, который проходит через все сокеты.посмотрите на Java Selector http://www.exampledepot.com/egs/java.nio/NbClient.html

1 голос
/ 18 марта 2012

Вы должны знать, что ваша операционная система не может обрабатывать столько потоков.Кроме того, для каждого потока выделяется память, поэтому вы очень быстро заполняете свою кучу.

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

0 голосов
/ 19 марта 2012

Если вам нужно обработать многие TCP-соединения с Java - вы должны использовать NIO . Но программировать голый NIO (Selector) сложно - поэтому используйте Netty , он разработан специально для таких задач. Также нетто прекрасно работает внутри Tomcat.

0 голосов
/ 18 марта 2012

Я думаю, что Селектор может помочь.Возможно, вы захотите прочитать краткое введение о Selector в этой ссылке http://tutorials.jenkov.com/java-nio/selectors.html "Селектор - это компонент Java NIO, который может проверять один или несколько каналов NIO и определять, какие каналы готовы, например, для чтения или записи. Таким образомодин поток может управлять несколькими каналами и, следовательно, несколькими сетевыми подключениями. "

0 голосов
/ 18 марта 2012

может быть, вы должны использовать пул потоков

http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html

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