victorwss:
Servidores web devem ser inerentemente multi-threaded.
O motivo é que eles devem ser capazes de atender vários usuários ao mesmo tempo.
Cada requeisição é tratada por uma determinada Thread. Criar e destruir threads é uma coisa computacionalmente cara, por isso que os containers (incluindo o tomcat) já criam um número razoável de threads no começo e as deixam inativas: para evitar de ter que criá-las ou destruí-las em um momento inoportuno, e para poder reutilizá-las (evitando destruir para depois criar).
Idealmente, você programa de forma que os dados usados em uma thread não sejam compartilhados com outras threads, o que já te dá um multi-threading escalável e robusto. Os problemas começam a surgir quando uma thread tem que fazer alguma coisa que pode influenciar outra thread. É importante minimizar a necessidade de comunicação de threads.
Não há nada de errado por si só em criar threads auxiliares no servidor. No entanto, na maioria das vezes que isso ocorre, é porque o programador fez besteira, fez alguma gambiarra e/ou não sabe direito o que está fazendo, logo isto tende a ser um forte bad-smell.
Estou de acodo com tudo dito acima.
Porem existem alguns casos específicos que precisam, ter performace, eu já trabalhei em uma estrutura bem tensa de theads, usando Callable, Pool de threads,BlockingQueue… (Já fico tenso só de lembrar) parecido com os containers dito pelo victors realmente são muito poucos casos que realmente precisa de estrutura assim, fora isso deve ter cuidado pois thread sai caro pro SO separar uma para sua aplicação e na maioria das vezes não compensa.
Você tem que analisar bem se compensa.
Um exemplo que podemos usar varias threads é quando vc tem um belo processamento de dados e existe um tempo de gargalho muito grande de espera de outro processo que vc ñ tem controle, por exemplo socket, webservice. Nestes casos vc consegue separar uma thread para fazer o processamento e a outra trabalhe a comunicação, enfilheirando as tarefas, mais nem sempre é vantajoso.
No Java existe bastante coisa para trabalhar com Thread, mais o interessante e vantajoso é se conseguir usar um pool de threads pois vc tera mais performance do que criar thread manualmente, digamos q vc reutiliza as threads, mais é complexo mexer de uma maneira eficaz com thread, e muito cuidado com as comunicações entre threads.
Pool de threads: