Locksupport es un hilo básico que bloquea el primitivo utilizado para crear bloqueos y otras clases de sincronización.
Las funciones de Park () e Unbark () en Locksupport son bloquear hilos e hilos de desbloque, respectivamente, y Park () y nok () no encontrarán el problema de los "puntos muertos que pueden ser causados por hilos.suspend e hilo.
Porque Park () e Unbark () tienen permisos; La competencia entre el hilo Calling Park () y otro hilo que intenta no hacer () permanecerá activa.
Uso básico
Locksupport es muy similar a un semáforo binario (solo hay 1 licencia disponible). Si esta licencia no ha sido ocupada, el hilo actual obtiene la licencia y continúa ejecutándose; Si la licencia ha sido ocupada, el hilo actual bloquea, esperando obtener la licencia.
public static void main (string [] args) {locksupport.park (); System.out.println ("bloque.");}Ejecutar el código revelará que el hilo principal siempre está bloqueando. Debido a que la licencia está ocupada por defecto, la licencia no se puede obtener al llamar a Park (), por lo que ingresa a un estado de bloqueo.
El siguiente código: primero libere la licencia, luego obtenga la licencia y el hilo principal puede terminar normalmente. La adquisición y la liberación de las licencias de Locksupport son generalmente correspondientes. Si no se desarra varias veces, no habrá ningún problema si solo se estaciona una vez. Como resultado, la licencia se encuentra en un estado disponible.
public static void main (string [] args) {Thread Thread = Thread.CurrentThread (); Locksupport.unpark (hilo); // libera la licencia Locksupport.park (); // Obtenga la licencia System.out.println ("B");}Locksupport no es reentrante. Si un hilo llama a Locksupport .park () dos veces seguidas, entonces el hilo definitivamente se bloqueará.
public static void main (string [] args) lanza la excepción {Thread Thread = Thread.CurrentThread (); Locksupport.unpark (hilo); System.out.println ("A"); Locksupport.park (); System.out.println ("B"); Locksupport.park (); System.out.println ("C");}Este código imprime A y B, pero no imprime C, porque el hilo no puede obtener permiso al llamar a Park por segunda vez.
Echemos un vistazo a la respuesta de las interrupciones correspondientes de Locksupport
public static void t2 () lanza la excepción {Thread t = new Thread (new Runnable () {private int count = 0; @Override public void run () {long start = system.currentTimemillis (); long end = 0; while ((end - start) <= 1000) {Count ++; end = System.CurrentTimemEmemillis (); + recuento); t.Start (); Thread.sleep (2000); // interrumpir el hilo T.interrupt (); System.out.println ("Main Over");}El hilo imprimirá el hilo over. Esto significa que si el subproceso se debe a Llamar Park, puede responder a una solicitud de interrupción (el estado de interrupción se establece en verdadero), pero no arrojará una Excepción InterruptedException.
Lista de funciones de soporte de bloqueo
// Devuelve el objeto de bloqueador proporcionado a la llamada del método de parque desbloqueado más reciente y devuelve nulo si la llamada no está bloqueada. Objeto estático getBlocker (hilo t) // Para la programación de hilos, deshabilite el hilo actual a menos que la licencia esté disponible. static void park () // Para la programación de hilos, deshabilite el hilo actual antes de que la licencia esté disponible. Parque vacío estático (bloqueador de objetos) // Para la programación de hilos, espere el tiempo de espera especificado como máximo a menos que la licencia esté disponible. Parknanos nanos nanos estáticos (nanos) // Para la programación de los hilos, deshabilite el hilo actual antes de que la licencia esté disponible y espere el tiempo de espera especificado como máximo. Parknanos voides estáticos (bloqueador de objetos, nanos largos) // Para la programación de subprocesos, el hilo actual está deshabilitado antes del límite de tiempo especificado a menos que la licencia esté disponible. Void static Parkuntil (fecha límite larga) // Para la programación de hilos, el hilo actual está deshabilitado antes del límite de tiempo especificado a menos que la licencia esté disponible. static void Parkuntil (bloqueador de objetos, fecha límite larga) // póngala a disposición si la licencia de un hilo determinado aún no está disponible. Vacío estático nok (hilo de hilo)
Ejemplo de soporte de bloqueo
Comparar "Ejemplo 1" y "Ejemplo 2" a continuación puede darle una comprensión más clara del uso de Locksupport.
Ejemplo 1
clase pública waitest1 {public static void main (string [] args) {thinda ta = new thinda ("ta"); sincronizado (ta) {// Obtenga el "bloqueo de sincronización del objeto TA" a través de sincronizado (ta) try {system.out.println (thread.currentThread (). getName ()+"inicio ta"); ta.Start (); System.out.println (thread.currentThread (). GetName ()+"bloque"); // El hilo principal está esperando ta.wait (); System.out.println (thread.currentThread (). GetName ()+"continuar"); } catch (InterruptedException e) {E.PrintStackTrace (); }}} La clase Static Thinda extiende el hilo {publicada public (nombre de cadena) {super (nombre); } public void run () {sincronizado (this) {// Obtener "el bloqueo de sincronización del objeto actual" a través de sincronizado (this) System.out.println (thread.currentThread (). getName ()+"wakup otros"); notificar(); // despertar "Hilo esperando en el objeto actual"}}}} Ejemplo 2
import java.util.concurrent.locks.locksupport; public class LocksupportTest1 {PRIVADO STICATIC HIRET MAYTHREAD; public static void main (string [] args) {thinda ta = new thinda ("ta"); // Obtenga el hilo principal mainthread = thread.currentThread (); System.out.println (thread.currentThread (). GetName ()+"inicio TA"); ta.Start (); System.out.println (thread.currentThread (). GetName ()+"bloque"); // El hilo principal bloquea Locksupport.Park (MAYTHREAD); System.out.println (thread.currentThread (). GetName ()+"continuar"); } La clase Static Thinda extiende el hilo {publicada public (nombre de cadena) {super (nombre); } public void run () {System.out.println (Thread.CurrentThread (). getName ()+"wakup otros"); // despertar el "hilo principal" Locksupport.unpark (MainThread); }}} Resultados de ejecución:
Inicio principal Tamain Blockta Wakup Otros Sigue Continuar
Descripción: La diferencia entre Park y Wait. Antes de esperar los hilos de bloques, el bloqueo de sincronización debe obtenerse a través de sincronizado.