Dúvida com Threads em programa Web

Tenho três processos que rodaram em um aplicativo web que são super pesados e demandam tempo. Eu ouvi falar que o browser para de responder as requisições depois de um tempo de inatividade e uma solução seria eu fazer esses três processos rodarem em Threads por baixo dos panos (background) até que ponto isso é verdade? Se sim como eu faria isso? Como eu ia saber que uma Thread executou o deveria para eu ficar colocando mensagens no browser? esse assunto ficou muito no ar pra mim… alguém pode me ajudar? Obrigado pela atenção.

Você não tem retorno da execução de uma thread.
Se você precisa esperar a thread acabar de rodar para continuar com o fluxo da regra de negócio não tem motivo para criar thread.

Se for um processamento que não precise esperar um retorno, basta executar sua thread e deixar que a JVM faz o resto.

Agora se por algum motivo você quer esperar o término da sua thread pra fazer algo, você tem que ficar verificando se sua trhead está viva, depois dar continuidade a seu négocio.

ex:

while (myThread.isAlive(){
//thread ainda em execução
}
//continuação da regra de negocio

Independente do browser parar de responder ou não, você precisa pensar no seu usuário: o que ele fará enquanto espera esse processo lento terminar?

Você pode fazer uma solicitação para iniciar esse processo via ajax e deixar o usuário continuar navegando…

Daí você cria um mecanismo para avisar o usuário que a solicitação está pronta…

Ele poderia até enfileirar várias solicitações de processos lentos e “sair pra almoçar” esperando ficarem prontas…

De qualquer forma a vantagem é que você não trava o usuário enquanto efetua este processamento.

[quote=AbelBueno]Independente do browser parar de responder ou não, você precisa pensar no seu usuário: o que ele fará enquanto espera esse processo lento terminar?

Você pode fazer uma solicitação para iniciar esse processo via ajax e deixar o usuário continuar navegando…

Daí você cria um mecanismo para avisar o usuário que a solicitação está pronta…

Ele poderia até enfileirar várias solicitações de processos lentos e "sair pra almoçar" esperando ficarem prontas…

De qualquer forma a vantagem é que você não trava o usuário enquanto efetua este processamento.
[/quote]
No caso a operação pode durar uns 20minutos dependendo da carga de dados que ele tiver no SGBD…
esta operação tem três fases, que precisam ser executadas em ordem exclusiva

então eu queria fazer com que o usuario visse o que estah sendo feito naquele momento como:

–> 1ª Etapa concluída em 37583758 ms…
–> 2ª Etapa executando … barra de progresso ficticia
–>3ª Etapa esperando pela conclusão da segunda etapa

Preciso realmente usar ajax para isso? ou Threads resolve? enfim como fazer isso sem travar as requiisições do browser…

Nao seria melhor vc startar a(s) threads, devolvendo o response imediatamente com algo do tipo “tarefa iniciada” e fornecer pra ele um mecanismo de
consulta, pelo qual ele poderia checar os “andamentos” da sua atividade?

Dessa forma ele vai trabalhando com outras coisas, e de vez em qdo volta pra ver como esta o “andamento”

:idea:

Ahn? É impressão minha ou 37583758ms equivalem a mais de 10 horas???

Não é que você precise utilizar ajax…mas neste caso acho que seja uma solução mais simples do que Threads
(Que exigem muito mais cuidado para se trabalhar especialmente em um ambiente web)

Além do mais, você não precisaria criar barras de progresso fictícias… poderia ter um feedback real do que o processo está fazendo…

[quote=fabim]Nao seria melhor vc startar a(s) threads, devolvendo o response imediatamente com algo do tipo “tarefa iniciada” e fornecer pra ele um mecanismo de
consulta, pelo qual ele poderia checar os “andamentos” da sua atividade?

Dessa forma ele vai trabalhando com outras coisas, e de vez em qdo volta pra ver como esta o “andamento”

:idea:[/quote]

Hummm… pode ser uma solução. Mas minha duvida principal é se eu preciso ficar mandando pro browser sempre dizendo “to vivo” pra ele não me matar, ou se isso é desnecessário?

Ahn? É impressão minha ou 37583758ms equivalem a mais de 10 horas???
[/quote]

era só um exemplo :frowning:

é isso que me preocupa, utilizar Thread em algo que nao preciso, e ter dores de cabeça com isso desnecessariamente…

Sim. o browser tem um tempo de limite de espera, é possivel inabilitar este problema se a pagina fizer requisições antes do tempo de timeout

Sim, uma solução realmente seria criar threads pois o servidor continuara o processo porem ficará complexo para mostrar ao usuario o andamento do processo, mais mesmo assim é possivel.

Exemplo: Criando uma tela só para acompanhar os processos(Threads) que estão rodando no servidor, é possivel tirar ‘fotos’ do estado do seu processo e guardar em um banco ou variavel para mostrar nesta tela, assim como tentar fazer uma estimativa de termino ,tempo de processamento…

è possivel usar o Callable é tipo uma Thread mais retorna o resultado quando o método run é finalizado… ou na propria thread ao terminar você atualizar uma tabela, ou variavel de escopo singleton para mostrar na tela de acompanhamento que citei o fim do processamento

[quote=anderson_lp789][quote=fabim]Nao seria melhor vc startar a(s) threads, devolvendo o response imediatamente com algo do tipo “tarefa iniciada” e fornecer pra ele um mecanismo de
consulta, pelo qual ele poderia checar os “andamentos” da sua atividade?

Dessa forma ele vai trabalhando com outras coisas, e de vez em qdo volta pra ver como esta o “andamento”

:idea:[/quote]

Hummm… pode ser uma solução. Mas minha duvida principal é se eu preciso ficar mandando pro browser sempre dizendo “to vivo” pra ele não me matar, ou se isso é desnecessário?[/quote]

E desnecessario.
Desde que o tempo de inatividade do usuario nao ultrapasse o que vc definiu no seu DD la em

[quote]Exemplo: Criando uma tela só para acompanhar os processos(Threads) que estão rodando no servidor, é possivel tirar ‘fotos’ do estado do seu processo e guardar em um banco ou variavel para mostrar nesta tela, assim como tentar fazer uma estimativa de termino ,tempo de processamento…
[/quote]
Acho que é o que eu vou fazer mesmo… onde consigo um material para conhecer mais sobre isso? principalmente para mostrar o tempo de processamento? por exemplo

1ª etapa executando … 1ms (e ir variando fazendo a contagem)

isso resolveria meu problema com a inatividade?

[quote]E desnecessario.
Desde que o tempo de inatividade do usuario nao ultrapasse o que vc definiu no seu DD la em [/quote]
Isso já não resolveria pois eu não faço idéia de qual valor definir no timeout, porque dependendo do volume de dados pode demorar 5 segundos ou muitos minutos mesmo.

Pelo jeito vou ter que fazer uma thread mesmo… onde posso material falando sobre isso? e ficar sinalizando pro browser de tempo em tempo que estou vivo? alguém me indica?