Thread - deyran - pequena dúvida :)

5 respostas
deyvid

Eu queria saber se quando uma thread vai durmir, outra thread que esta no estado de runnable pode assumir o processador enquanto a thread dorme ou o processador fica ocioso enquanto a thread dorme e quando ela sai do “sleep” volta para concorrer com outras threads do mesmo estado (no caso runnable). Desde já agradeço

5 Respostas

T

Quando uma thread chama Thread.sleep, ela diz ao sistema operacional que pode aproveitar o tempo restante para qualquer outra coisa - por exemplo, pode rodar uma outra thread do mesmo programa, ou pode rodar um outro programa.
Como o sistema operacional fica “trocando” entre threads e processos continuamente (em alguns sistemas operacionais ele pode efetuar 100 ou 1000 trocas por segundo), e como pode haver mais que um processador, o que o sistema operacional faz com o tempo restante depende muito das outras threads e outros processos rodando na mesma máquina.

T

Não é a thread que sai do “thread.sleep”.
É o sistema operacional que acorda a thread, depois do tempo solicitado.
Aí ela pode realmente “concorrer” com outras threads que estejam disponíveis para rodarem.
Como normalmente o sistema operacional fica “chaveando” entre threads, pode ser que ela não acorde imediatamente, dependendo de sua prioridade.
Então o tempo dado por Thread.sleep é aproximado; pode ser que a thread demore um pouco mais para acordar (mais ou menos quando você deixa o despertador para as 05:00 da manhã mas você só acorda às 05:15, depois de muito golpear o despertador para que ele se acalme.

ViniGodoy

Lembrado que num SO menos esperto, como o dos celulares antigos, pode ser que o sleep pare o processamento, mas não cause preempção. Ou seja, sua thread dorme, mas nenhuma processa no lugar (exceto talvez a do reloginho, que faz ela acordar). Lembro-me de um motorola antigo que eu tinha que fazia exatamente isso. E não duvido que o sleep fosse implementado assim:

for (int i = 0; i < sleepTime; i++) naoFazNadaPorUmMili();

Isso só reitera o que o Thingol disse: No final das contas, quem decide o que faz com o tempo livre no sleep é o sistema operacional. Por isso, não conte com a ordem em que as coisas acontecem em outras threads, a menos que você as sincronize explicitamente.

deyvid

Valeu pessoal

rmala_ti

Bom dia!
Iniciei o capítulo de Threads e lendo o post, surgiu uma dúvida.

Não é a thread que sai do “thread.sleep”.
É o sistema operacional que acorda a thread, depois do tempo solicitado.
Aí ela pode realmente “concorrer” com outras threads que estejam disponíveis para rodarem.
Como normalmente o sistema operacional fica “chaveando” entre threads, pode ser que ela não acorde imediatamente, dependendo de sua prioridade.
Então o tempo dado por Thread.sleep é aproximado; pode ser que a thread demore um pouco mais para acordar (mais ou menos quando você deixa o despertador para as 05:00 da manhã mas você só acorda às 05:15, depois de muito golpear o despertador para que ele se acalme.

Qual seria então o papel do Agendador de Threads?
Thingol, quando vc diz “É o sistema operacional que acorda a thread”, o resposável por fazer isto seria o Agendador???

Desculpa se minha dúvida é muito básica, mas não entendi direito esta parte.

Grato.

Criado 14 de abril de 2009
Ultima resposta 15 de abr. de 2009
Respostas 5
Participantes 4