Multithreading (5) Cola de bloqueo y estrategia de rechazo en multithreading

  public ThreadPoolExecutor(int corePoolSize, //核心线程数
                              int maximumPoolSize,//最大线程数
                              long keepAliveTime,//非核心线程存活时间
                              TimeUnit unit,//时间单位
                              BlockingQueue<Runnable> workQueue,//阻塞队列
                              ThreadFactory threadFactory, //线程工厂
                              RejectedExecutionHandler handler) {//拒绝策略

La cola de bloqueo es el parámetro workQueue en ThreadPoolExecutor.

Las colas de bloqueo son: ArrayBlockingQueue (cola de bloqueo de matriz), LinkedBlockingQueue (cola de bloqueo de lista vinculada / cola ilimitada), SynchronousQueue (cola síncrona), DelayedWorkQueue (cola de trabajo retrasada)

ArrayBlockingQueue

  Estructura subyacente : matriz estática con capacidad fija y sin mecanismo de expansión (a diferencia de ArrayList es una matriz dinámica). Si no hay contenido en el subíndice de la matriz, se rellenará con nulos.

  Usa el mismo candado

Bloqueo : Al salir de la cola, si la cola está vacía, bloquee notEmpty. Al ingresar a la cola, la cola está llena y notFull está bloqueado.

Agregue elementos del encabezado de la cola a la cola, registre putIndex, despierte notEmpty

Sal de la cola para obtener el elemento del jefe del equipo, registra el takeIndex, no despiertas.

Orden : primero en entrar, primero en salir

 

LinkedBlockingQueue

   Estructura de datos : Nodo de lista enlazada (siguiente, anterior ...), se puede especificar la capacidad, Integer predeterminado.MAX_VALUE

 Hay dos bloqueos : take takeLock = new ReentrantLock (); put putLock = new ReentrantLock ();

Separación de lectura y escritura, agregue takeLock al buscar, putLock al guardar y agregue los dos bloqueos juntos al eliminar.

Únase al equipo desde el final del equipo, registre el último nodo

Sal del equipo primero, registra el nodo principal.

Orden : primero en entrar, primero en salir

Estrategia de rechazo

Una es lanzar la excepción directamente, la otra es descartar la tarea directamente y la otra es descartar la tarea que ha estado esperando por más tiempo y la otra se olvida. AbortPolicy lanza una excepción directamente y el programa se interrumpe. ; CallerRunsPolicy rollback caller
DiscardOldestPolicy descarta la tarea de espera más larga en la cola e intenta enviar DiscardPolicy para descartar directamente la tarea.
Uso: el
uso específico depende de la empresa. Si la empresa puede admitir la publicación de excepciones, utilice la excepción de lanzamiento, si el La tarea se puede descartar, utilice la estrategia de descarte. No hay una forma específica. He visto un framework reescribiendo la política de rechazo que no se ocupa de nada, olvidé cuál es apache.

Supongo que te gusta

Origin blog.csdn.net/x18094/article/details/114993856
Recomendado
Clasificación