Java Thread для управления сокетом и запуска метода класса - PullRequest
1 голос
/ 10 марта 2012

У меня есть поток Java, который я запускаю, поэтому он продолжает слушать сокет (учитывая, что чтение сокета блокирует поток, необходимо).

После того, как поток получает данные из сокета, ему нужно вызвать метод из класса.

Теперь у меня есть два варианта сделать это:

Объявите интерфейс, который передается в поток и реализуется в классе. Когда поток вызывает метод интерфейса, реализующие классы будут его запускать.

Или я могу передать экземпляр класса в Thread в качестве параметра, а затем вызвать метод класса.

Но я хотел знать, блокируется ли поток во время работы метода.

Полагаю, что так, но я не уверен.

Я хотел, чтобы поток имел поведение события Socket. Я имею в виду только то, что отвечаю только за чтение данных из функций сокетов и запуска в основном классе, который называется потоком.

Ответы [ 3 ]

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

У вас есть различные варианты:

  • Сделать ваш класс дочерним классом Thread (более простой код, но вы объедините функциональную часть - ваш основной код - с техническим аспектом (расширение Thread))
  • Сделайте так, чтобы ваш класс реализовывал интерфейс Runnable и запустил новый поток с этим Runnable (я часто так делаю).Таким образом, ваш основной код все еще остается в переопределенном методе run, но дерево наследования зависит от вас (ваш основной класс может расширять один из ваших других классов)
  • Держите разделенный ваш основной код / ​​поток на два класса (один для вашего основного кода, один для потока), связывая два по вашему желанию (помните, что если вы создаете внутренний поток внутри другого класса, внутренний поток может использовать любые конечные свойства, например).

Как указывалось в других ответах, все, что происходит в вашем методе run (), конечно, блокирует выполнение.

Как замечание, если вы собираетесь работать с потоками и сокетами, я настоятельно рекомендую вамчтобы взглянуть на каркасы NIO, такие как Netty , которые как раз предназначены для такого поведения: клиент-серверное приложение, управляемое событиями, через сокеты NewIO.

В качестве еще одного идентификатора я часто использую этот шаблон:

  • запустить поток сбора данных, который будет перехватывать событие;
  • выдвинуть их в связанной очереди блокировки (очередьe.offer ());
  • имеет другой поток, который разделяет ту же самую очередь связанных блокировок (с queue.take ()): эта операция блокирует, потоки будут заблокированы, пока очередь пуста;

Это очень простой способ иметь один поток как «производитель» и один поток как «потребитель».В одной и той же очереди могут находиться различные потребители.

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

Да, поток будет блокироваться при выполнении метода, поэтому он не может одновременно читать данные из сокета. Информация не будет потеряна, передача займет больше времени, и вы можете получить тайм-аут сокета, если вычисление занимает слишком много времени.

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

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

Но я хотел знать, блокируется ли поток во время работы метода

Да, он блокируется.
Если внутри run, вы вызываете метод для его обработкине имеет значения, является ли это интерфейсом и т. д., поскольку вы спрашиваете, имеет значение только то, что делает метод на самом деле

В вашем случае у вас есть только 1 вариант.
Убедитесь, что выверните элемент управления обратно в ваш поток прослушивания сокетов как можно скорее.
Это может произойти, если вы спроектируете / передадите мандату класс обработки для обработки обработки в другом потоке.
На самом деле ваша проблема не является чем-то новым.В проектах, основанных на событиях, необходимо обрабатывать событие как можно быстрее, чтобы не блокировать поток на основе очереди событий.
И именно так я бы рекомендовал вам проектировать arround.Не используйте какой-либо интерфейс для взаимодействия с прослушивающим потоком, но зарегистрируйте прослушиватели событий.

Когда происходит событие, т. Е. Ваш прослушивающий поток читает данные, он передает данные как событие вашим слушателям (слушателям), и в этот момент он блокируется.
Затем вы должны начать новый поток, чтобывыполнить обработку, и поток прослушивания может продолжить свою работу

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