Во-первых, существуют некоторые методологические проблемы с этим способом, поскольку порт может использоваться, но не прослушивать.
Если вы на самом деле просто ищете прослушивающие порты и хотите использовать описанный выше подход, по крайней мере порождайте некоторые потоки, чтобы вам не приходилось ждать, когда для каждого порта истекает время ожидания последовательно.
Лучшим способом было бы имитировать что-то вроде сканирования синхронизации, а не делать полное TCP-рукопожатие, но я не уверен, что вы можете получить это близко к металлу в Java.
Хороший вопрос.