Вы можете использовать поток, который читает данные из сокета.Если работа связана с центральным процессором, вы мало выиграете, запустив другой поток просто для отправки события.
С другой стороны, если вы создаете библиотеку, вы не будете иметь никакого контроля над тем, чтоПользователь будет делать, когда вы вызываете метод слушателя, поэтому я бы посоветовал вам использовать внутренний Executor и дать вашей библиотеке метод, подобный terminate ().Вызов метода слушателя будет делегирован в исполняемый файл, который вы передадите Исполнителю (это может быть newSingleThreadExecutor, newCachedThreadPool или как вам удобнее).
Таким образом, пользователи знают, что они должны вызвать init() и terminate () - где init () инициализирует Executor, а terminate () позаботится о его закрытии.Это позволяет вам иметь свои собственные потоки в вашей библиотеке и не давать им помешать основному приложению завершить работу
Взгляните на this , может дать вам лучшее представление о том, что я 'Я говорю о.