Dipende:
se il tempo di esecuzione dei messaggi e' molto breve e i messaggi non sono molti, no.
Se non sono tanti ma richiedono un sacco di tenpo per essere eseguiti, si
se i messaggi sono tanti e richiederebbero TROPPI thread (NON PUOI creare migliaia di thread, ma qualche decina), allora si usa un thread per metterli in una coda e poi un pool di thread per processarli
Poi esiste un'altro approccio che si chiama non-blocking IO
https://docs.oracle.com/javase/8/docs/technotes/guides/io/index.html