Park & Unpark
uso básico
Ellos método de clase LockSupport
// 暂停当前线程
LockSupport.park();
// 恢复某个线程的运行
LockSupport.unpark(暂停线程对象)
característica
En comparación con la espera y notificar a objetos
- espera, notificar y notifyAll debe ser usado en conjunción con el objeto de monitor, y el parque, anular el estacionamiento no tienen que
- Park & hilo Unpark se bloquea en unidades de [] y [] despiertan el hilo, y notifican solamente una estela azar esperando hilos, notifyAll despierta todas las discusiones de espera son, no tan precisa []
- parque y la pueden liberar primero anular el estacionamiento, y no esperar y notificar: Notificar:
principio parque Unpark
Cada hilo tiene su propio un objeto Parker consta de tres partes counter
, cond
y mutex
trazar una analogía
- Enhebrar como un viajero, Parker como su equipaje de mano, tienda mochila como la relación de estado variable. _counter como comida mochila alternativo seco (0 agotamiento, suficiente 1)
- Llamar al parque es de ver o necesidad de parar y descansar
- Si las raciones piezas agotados, a continuación, se metió en la tienda para descansar
- Si hay suficiente alimento seco libre, así que no es necesario parar y seguir adelante
- anular el estacionamiento de llamada, como la comida tan seco suficientes
- Si entonces todavía enhebrar tienda, por lo que iba a despertar y seguir adelante
- Si el hilo sigue corriendo en este momento, entonces la próxima vez que él llama el parque, único alimento seco se consume repuesto, sin quedarse para seguir adelante
- Debido al espacio limitado bolsa, varias llamadas a anular el estacionamiento sólo se añadirían un alimento seco repuesto
- Debido al espacio limitado bolsa, varias llamadas a anular el estacionamiento sólo se añadirían un alimento seco repuesto
- El hilo actual llama al método Unsafe.park ()
- Compruebe _counter, esta situación es 0, esta vez, para obtener mutex _mutex
- Enrosque en la variable bloqueado _cond condición
- _counter Proporcionada = 0
- Call Unsafe.unpark método (Thread_0), conjunto _counter 1
- Wake _cond estado variable Thread_0
- operación de reanudación Thread_0
- _Counter puesto a 0