Primeiro, uma pergunta realmente idiota, eu estava me perguntando o que o 'estacionamento' em espera significa? O thread está esperando para ser estacionado ou acabou de ser estacionado e, portanto, está no estado de espera? E quando esse estacionamento acontecer, quantos recursos de CPU / memória serão usados? Qual é o propósito de estacionar um fio?
Em segundo lugar, olhando para o método park na API de thread Java
Desativa o thread atual para fins de agendamento de thread, a menos que a permissão esteja disponível.
Se a licença estiver disponível, ela é consumida e a chamada retorna imediatamente; caso contrário, o thread atual será desabilitado para fins de agendamento de thread e ficará inativo até que uma das três coisas aconteça ...
Inglês não é meu idioma principal, então tenho algumas dificuldades em entender que, eu pretendia 'permitir' como uma espécie de 'permissão para estacionar o fio', então as perguntas a seguir:
- qual é o significado disso, o que é 'licença' e quem e como está verificando essas licenças?
- O que isso significa: 'se a licença estiver disponível, então ela será consumida', está ficando 'estacionada'?
- a seguir, se o segundo ponto for verdadeiro, então qual é a diferença entre 'estacionar' e 'ficar dormente'? Se eu tiver permissão, posso estacioná-lo para sempre e, se não, posso deixá-lo 'inativo'?
obrigado
fonte
park()
significa "Quero suspender minha execução até que algum outro encadeamento me dê uma permissão chamandounpark()
".De acordo com a documentação do estado do thread java , um thread pode ir para o estado WAITING por três motivos:
Quando você chama um método de estacionamento em um Thread, ele desativa o thread para fins de agendamento de thread, a menos que a permissão esteja disponível. Você pode chamar o método unpark para disponibilizar a permissão para o encadeamento fornecido, se ainda não estiver disponível.
Portanto, quando seu Thread estiver no modo WAITING por LockSupport.park, ele mostrará como WAITING (parking).
Observe que você só pode chamar o estacionamento no Tópico atual. Este é um mecanismo muito útil para implementar o Padrão de Design Produtor-Consumidor.
fonte
Na descrição da classe (no topo do javadoc LockSupport ), onde descreve a licença:
(Eu expandi o [texto] para torná-lo mais fácil de ler para quem não fala inglês.)
Esperançosamente, alguém com uma compreensão mais profunda pode elaborar sobre isso.Veja a resposta de axtavt.Como nota final, uma citação final do javadoc:
fonte
A parte que me fez revisitar essa questão que não consegui contornar ao ler a documentação foi:
Então, quando a licença está "disponível", quem e como a disponibiliza, para que possa ser consumida imediatamente? Isso foi de alguma forma trivial de descobrir:
public static void main(String[] args) { Thread parkingThread = new Thread(() -> { System.out.println("Will go to sleep..."); sleepTwoSeconds(); System.out.println("Parking..."); // this call will return immediately since we have called LockSupport::unpark // before this method is getting called, making the permit available LockSupport.park(); System.out.println("After parking..."); }); parkingThread.start(); // hopefully this 1 second is enough for "parkingThread" to start // _before_ we call un-park sleepOneSecond(); System.out.println("Un-parking..."); // making the permit available while the thread is running and has not yet // taken this permit, thus "LockSupport.park" will return immediately LockSupport.unpark(parkingThread); } private static void sleepTwoSeconds() { try { Thread.sleep(1000 * 2); } catch (InterruptedException e) { e.printStackTrace(); } } private static void sleepOneSecond() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
O código fala por si mesmo, o
thread
está em execução, mas ainda não foi chamadoLockSupport.park
, enquanto alguma outra thread o chamaLockSupport.unpark
- tornando a permissão disponível. Depois ligamosLockSupport.park
e ele retorna imediatamente, pois a licença está disponível.Depois de pensar sobre isso, isso é um pouco perigoso, se você expõe seus threads a algum código que você não controla e esse código chama
LockSupport.unpark
enquanto vocêpark
depois disso - pode não funcionar.fonte
Pelo que entendi, a "licença" é apenas um objeto que representa se um Thread pode ser "desestacionado" ou não. E isso é verificado pelo próprio Thread (ou de JRE quando você tenta estacionar um Thread) A coisa "está consumido", eu entendo que a licença desaparece e o Thread não é desabilitado.
Acho que você deveria aprender um pouco mais sobre multithreading. Pense nisso como um dispensador com objetos chamados "permitir". Você diz a um Thread para estacionar, e o Thread verifica o dispensador, se houver uma "licença", o Thread pega e sai (sem estacionar). Se não houver "permissão" no dispensador, o Thread fica estacionado até que uma "licença" esteja disponível (e você pode colocar uma "licença" no dispensador com
unpark
.Quanto ao uso de CPU / memória, acho que depende do SO, etc ...
fonte