Como a multithread é diferente em um aplicativo Web baseado em Java e em um aplicativo Java autônomo


13

Eu sou bastante novo em Java e minha experiência é limitada a aplicativos baseados na Web em execução em um contêiner da Web (Jboss no meu caso).

Estou correto ao dizer que, para aplicativos da Web, o contêiner da web cuida da multithreading? Em caso afirmativo, posso introduzir novos passos em aplicativos baseados na Web? Existe alguma vantagem em fazer isso e em que cenário seria necessário fazer isso?


Até EE6 não usarás threads; EE7 apresenta Concurrency Utilities.
Reintegrar Monica - M. Schröder

Respostas:


20

Estou correto ao dizer que, para aplicativos da Web, o contêiner da web cuida da multithreading?

A maioria dos servidores da Web (Java e outros, incluindo o JBoss) segue um modelo "um thread por solicitação", ou seja, cada solicitação HTTP é totalmente processada por exatamente um thread. Esse encadeamento geralmente passa a maior parte do tempo aguardando itens como solicitações de banco de dados. O contêiner da web criará novos threads conforme necessário.

Alguns servidores (no ecossistema Java principalmente Netty ) fazem tratamento de solicitações assíncronas, com um modelo "um thread faz tudo" ou algo mais complexo. A idéia básica é que ter muitos threads em espera desperdiça recursos, portanto, trabalhar de forma assíncrona pode ser mais eficiente.

Em caso afirmativo, posso introduzir novos passos em aplicativos baseados na Web?

É possível, mas deve ser feito com muito cuidado, pois erros (como vazamento de memória ou falta de sincronização) podem causar bugs que são muito difíceis de reproduzir ou derrubar todo o servidor.

Existe alguma vantagem em fazer isso e em que cenário seria necessário fazer isso?

Bem, a vantagem é que você pode fazer coisas em paralelo. Usar threads para melhorar a velocidade computacional pura é algo que você não deve fazer em um servidor da Web, pois isso atrasaria o processamento de outras solicitações. Esse tipo de coisa deve ser feito em um servidor separado, provavelmente usando algum tipo de fila de trabalhos.

Um cenário legítimo para multithreading no contexto de manipulação de uma solicitação HTTP pode ser se você precisar acessar outros recursos de rede, por exemplo, chame vários serviços da web diferentes. Se você fizer isso de uma só vez, precisará aguardar que cada chamada termine sucessivamente. Mas se você usar vários encadeamentos, o tempo total de espera será apenas o atraso da chamada mais lenta.


3
Faz sentido. A Interface ExecutorService é a melhor maneira de criar novos threads em um aplicativo Web?
kapricanon

4
@kapricanon: sim, a menos que você tenha alguns requisitos específicos que ele não possa atender ou seu servidor da Web já tenha algo semelhante.
Michael Borgwardt

2

Em resposta à sua pergunta:

Como a multithread é diferente em um aplicativo Web baseado em Java e em um aplicativo Java autônomo

Não é diferente. Normalmente, os aplicativos da Web baseados em software fornecem já vários threads, tornando cada nova solicitação um encadeamento. Por você pode usar / criar threads como faria com qualquer outro aplicativo.

De fato, o multiencadeamento pode oferecer aumentos drásticos no desempenho, se você usá-lo corretamente. Para tarefas intensivas de E / S, como acesso à rede e acesso à unidade de disco, o aumento de desempenho é quase sempre garantido. Para tarefas computacionalmente intensivas, você deve seguir a regra de um encadeamento por núcleo no servidor. Por exemplo, se seu núcleo possui um processador i7, você deve manter 7 threads para executar tarefas computacionais.

Em resposta à sua pergunta:

Existe alguma vantagem em fazer isso e em que cenário seria necessário fazer isso?

Michael Borgwart diz que você não deve fazer isso para melhorar a velocidade computacional. Não concordo, pois este artigo sugere que o multiencadeamento pode ajudar a fornecer capacidade de resposta quando os usuários precisam de uma tarefa computacionalmente pesada. Em inglês simples, os usuários não precisarão esperar tanto tempo para concluir tarefas computacionalmente pesadas com multiencadeamento.

Se você pretende usar muito os threads, sugiro o uso de um pool de threads. Isso reduzirá a sobrecarga da criação de threads.


Como isso responde à pergunta?
Gnat #

1
As respostas devem ter seus próprios méritos. Se você quiser comentar, terá que ganhar 50 pontos de reputação primeiro.
ChrisF

1

Bem, essa é uma boa pergunta e acho que a maioria dos desenvolvedores que trabalham no desenvolvimento de aplicativos da Web não usa multithreading explicitamente. O motivo é bastante óbvio, já que você está usando um servidor de aplicativos para implementar seu aplicativo, o servidor de aplicativos gerencia internamente um conjunto de encadeamentos para solicitações recebidas.

Então, por que usar multithreading explicitamente? O que é necessário para um desenvolvedor de aplicativos da Web se expor ao multithreading?

Quando você trabalha em um aplicativo de larga escala, no qual é necessário atender a muitos pedidos simultaneamente, é difícil atender a todos os tipos de solicitação de forma síncrona, porque esse tipo de solicitação pode estar processando muito, o que pode prejudicar o desempenho do aplicativo.

Vamos dar um exemplo em que um aplicativo Web, depois de atender a um tipo específico de solicitação, deve notificar os usuários por email e SMS. Fazer isso de forma síncrona com o encadeamento de solicitação pode reduzir o desempenho do seu aplicativo Web. Então aqui vem o papel da leitura mútua. Nesses casos, é aconselhável desenvolver um aplicativo multithread independente pela rede, responsável por enviar apenas email e SMS.


por que esta resposta foi reduzida?
Anurag Sharma
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.