O LockSupport é um primitivo básico de bloqueio de encadeamento usado para criar bloqueios e outras classes de sincronização.
As funções de Park () e UMPARK () no LockSupport devem bloquear linhas e threads desbloquear, respectivamente, e o park () e o underk () não encontrarão o problema "de impulsos que podem ser causados pelo problema do thread.suspend e Thread.Resume".
Porque park () e uplark () têm permissões; A competição entre o parque de chamadas de threads () e outro tópico que tenta UMPARK () permanecerá ativo.
Uso básico
O LockSupport é muito semelhante a um semáforo binário (apenas 1 licença está disponível). Se esta licença não tiver sido ocupada, o encadeamento atual obterá a licença e continua a executar; Se a licença estiver ocupada, os blocos de thread atuais, aguardando para obter a licença.
public static void main (string [] args) {LockSupport.park (); System.out.println ("Block.");}A execução do código revelará que o encadeamento principal está sempre bloqueando. Como a licença é ocupada por padrão, a licença não pode ser obtida ao ligar para o parque (), por isso entra em um estado de bloqueio.
O seguinte código: primeiro libere a licença e, em seguida, obtenha a licença e o thread principal pode terminar normalmente. A aquisição e liberação de licenças de suporte da LockSupend geralmente são correspondentes. Se você desfazer várias vezes, não haverá problema se você estacionar apenas uma vez. Como resultado, a licença está em um estado disponível.
public static void main (string [] args) {thread thread = thread.currentThread (); LockSupport.unpark (Thread); // Libere a licença LockSupport.park (); // obtenha o sistema de licença.out.println ("b");}Locksupport não é reentrante. Se um thread chama LockSupport .Park () duas vezes em uma linha, o thread definitivamente bloqueará.
public static void main (string [] args) lança exceção {thread thread = thread.currentThread (); LockSupport.UnPark (Thread); System.out.println ("A"); LockSupport.park (); System.out.println ("B"); LockSupport.park (); System.out.println ("C");}Este código imprime A e B, mas não imprime C, porque o thread não pode obter permissão ao ligar para o Park pela segunda vez.
Vamos dar uma olhada na resposta das interrupções correspondentes de Locksupport
public static void t2 () lança exceção {thread t = new Thread (new runnable () {private int conting = 0; @Override public void run () {long start = system.currenttimemillis (); long end = 0; while (end - start) <= 1000) {count ++; end = system.curntEmillis (end - start) <= 1000 {count ++; + contagem); t.start (); Thread.sleep (2000); // interrompa thread t.interrupt (); System.out.println ("Main Over");}O thread imprimirá o thread sobre o thread. Isso significa que, se o thread bloquear devido ao parque de chamadas, ele poderá responder a uma solicitação de interrupção (o status de interrupção estiver definido como true), mas não lançará uma interrupção.
Lista de funções LockSupport
// Retorna o objeto Bloqueador fornecido à chamada do método do parque desbloqueada mais recente e retorna nulo se a chamada não estiver bloqueada. Objeto estático getBlocker (Thread t) // Para agendamento de threads, desative o thread atual, a menos que a licença esteja disponível. Parque Void estático () // Para agendamento de threads, desative o thread atual antes que a licença esteja disponível. Parque Void estático (bloqueador de objetos) // Para agendamento de threads, aguarde o tempo de espera especificado no máximo, a menos que a licença esteja disponível. Parknanos de vazio estático (nanos longo) // Para agendamento de threads, desative o thread atual antes que a licença esteja disponível e aguarde o tempo de espera especificado na maioria. Parknanos estático void (bloqueador de objetos, nanos longo) // Para agendamento de threads, o encadeamento atual é desativado antes do prazo especificado, a menos que a licença esteja disponível. Parkuntil de vazio estático (prazo longo) // Para programação de threads, o thread atual é desativado antes do prazo especificado, a menos que a licença esteja disponível. Parkuntil de vazio estático (bloqueador de objetos, prazo longo) // disponibilize -o se a licença de um determinado thread ainda não estiver disponível. Void estático UMPARK (Thread Thread)
Exemplo LockSupport
Comparar "Exemplo 1" e "Exemplo 2" abaixo pode fornecer uma compreensão mais clara do uso do LockSupport.
Exemplo 1
classe pública waittest1 {public static void main (string [] args) {threada ta = new threada ("ta"); sincronizado (ta) {// Obtenha o "bloqueio de sincronização do objeto ta" através do sincronizado (ta) try {system.out.println (thread.currentThread (). getName ()+"start ta"); ta.start (); System.out.println (thread.currentThread (). GetName ()+"bloco"); // O tópico principal está esperando por ta.wait (); System.out.println (thread.currentThread (). GetName ()+"continua"); } catch (interruptedException e) {e.printStackTrace (); }}} classe estática threada estende thread {public threada (nome da string) {super (nome); } public void run () {sincronizado (this) {// obtém "o bloqueio de sincronização do objeto atual" por meio de sincronizado (this) system.out.println (thread.currentThread (). getName ()+"wakup outros"); notificar (); // Acorde "Thread Thread no objeto atual"}}}} Exemplo 2
importar java.util.concurrent.locks.locksupport; public class LockSupportTest1 {private Static Thread MainThread; public static void main (string [] args) {threada ta = new threada ("ta"); // obtenha o thread principal mainthread = thread.currentThread (); System.out.println (thread.currentThread (). GetName ()+"start ta"); ta.start (); System.out.println (thread.currentThread (). GetName ()+"bloco"); // os blocos principais blocos de threadsupport.park (mainthread); System.out.println (thread.currentThread (). GetName ()+"continua"); } classe estática threada estende thread {public threada (nome da string) {super (nome); } public void run () {System.out.println (thread.currentThread (). getName ()+"wakup outros"); // acorde o "Thread Main" LockSupport.UnPark (MainThread); }}} Resultados em execução:
Start principal Tamein Blockta Wakup Othersmain Continue
Descrição: A diferença entre parque e espera. Antes de esperar os threads dos blocos, o bloqueio de sincronização deve ser obtido por meio de sincronizado.