Вы можете использовать Пул потоков, поскольку он дает очень хорошую производительность. Я реализовал и делюсь с вами приведенным ниже фрагментом кода.
try {
ExecutorService executor = Executors.newFixedThreadPool("no. of threads");
// no. of threads is depend on your cpu/memory usage it's better to test with diff. no. of threads.
Runnable worker = new MyRunnable(message);
// message is the javax.mail.Message
executor.execute(worker);
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
}