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
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.
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.
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.
Valeu pessoal
Bom dia!
Iniciei o capítulo de Threads e lendo o post, surgiu uma dúvida.
[quote]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.
[/quote]
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.