Máquina Virtual JVM-7. Análisis plano JAVA Multithreading FAQ

concepto multihilo

Procesos e hilos

El proceso es la unidad mínima del sistema operativo para la asignación de recursos, CPU pasa de un proceso a otro proceso, llamado el cambio de contexto.

Un hilo es la unidad más pequeña de planificación de la CPU, es parte del proceso, creado por el proceso, un proceso tiene un 1 ~ N hilos. Tema se divide en hilo de usuario y la guarda de hilo, la diferencia entre los dos es que esta última va a terminar con los extremos del hilo principal.

clase de Tema

clase hilo Heredar, reemplazar el método run () puede ser.

La espera diferencia y slepp

  • método wait () debe ser utilizado de bloques de sincronización synchornized.
  • wait () método libera el bloqueo de objetos por el synchornized bloqueado, y el sueño () no lo hará.
  • La obstrucción formada por el método wait () puede ser llamado por el alcance synchornized para el mismo bloqueo de objeto de notificar () o notifyAll () para "despertar", y el sueño () no puede despertar, despertar, o sólo puede ser interrupción temporizada ( ) interrumpido.

La diferencia entre el sueño y el rendimiento de

  • sueño (después) de la aplicación en el bloqueado automáticamente despierta después de algún tiempo, el retorno al estado preparado, y después de que el método de rendimiento, el hilo directamente en el estado preparado.
  • el sueño después de la ejecución, otros hilos, independientemente de la prioridad puede tener la oportunidad de run (); y la implementación de rendimiento () sólo se dará la oportunidad de la misma prioridad o superior subproceso de prioridad para funcionar.
  • sleep () arrojará InterruptedException, mientras que la sentencia yield () sin ninguna excepción.
  • sleep () que el rendimiento () es más portátil, el uso de rendimiento en un bucle () propenso a un bucle sin fin, la prioridad del subproceso actual es alta, después de la ejecución de rendimiento y aprovechar a la CPU.

Interfaz ejecutable

método de interfaz, run () RUNNABLE implementar. grupo de subprocesos sólo puede aceptar objetos Ejecutable o tipo de interfaz invocable como la tarea del grupo de subprocesos.

subprocesos

creación de rosca y la destrucción consumirá recursos, en el caso de un gran número de concurrente, preferiblemente de antemano para crear múltiples hilos, y la gestión centralizada, la formación de un grupo de subprocesos.

Albacea

Java proporcionada inicialmente para lograr un grupo de subprocesos ThreadPool, con el fin de lograr una mejor planificación de hebras de nivel de usuario, de manera más eficaz los desarrolladores de contribuir al desarrollo de multi-hilo, Java proporciona un marco Ejecutor.

 Este marco incluye la agrupación de hebras de dos núcleos ScheduledThreadPoolExecutor y ThreadPoolExecutor. El primero se utiliza para realizar periódicamente una tarea que se va a utilizar para realizar tareas presentadas. Su llamado submit () y ejecutar () para enviar la tarea al grupo de subprocesos. Teniendo en cuenta el principio central de los dos grupo de subprocesos es el mismo, ejecutores para alcanzar los siguientes cuatro tipos de ThreadPoolExecutor:

Exigible 和 Futuro

Estas dos interfaces pueden hacer que el hilo puede realizar tareas sin valor de retorno.

Wait () 和 Notify (), notify ()

método wait () hace que el hilo actual a renunciar a sus existencias actuales de bloqueo de objeto, y en el estado bloqueado, y notificar (), notify () no libera el bloqueo del objeto.

contenedor seguro para subprocesos

ConcurrentHashMap

El espacio se divide en un número de su propio segmento, cada segmento de cada aplicación y una cerradura (de ReentrantLock), por lo que la contención de bloqueo se reduce, sino que también permite un cierto número de hilos de operación de lectura, lo que aumenta la concurrencia.

ConcurrentSkipListMap / ConcurrentSkipListSet

Ambos contenedores y son concurrentes TreeMap TreeSet. tabla de saltos es una estructura de datos de árbol binario equilibrado puede ser reemplazado por "espacio de tiempo" algoritmo para lograr un mapa orden de las conversaciones de fallos.

CopyOrWriteArrayList / CopyOrWriteArraySet

CopyOrWrite esencia es la utilización de alta concurrencia tiempo poco de lectura y escritura, lectura desbloqueado, el tiempo para escribir una copia de la nueva colección, las modificaciones en la nueva colección de lo anterior, luego reemplace el conjunto de la nueva colección. El último se consigue por la primera, un conjunto diferente cuando el método add necesita llamar método addIfAbsent (), que atraviesan la matriz actual. (Eliminar duplicados)

ConcurrentLinkedQueue/ConcurrentLinkedDeque

Cadena para lograr no bloqueante y deque basada en colas concurrente.

BlockingQueue / BlockingDeque

El bloqueo de la interfaz de colas concurrente, proporcionando la obstrucción de inserción y el método puesto puede tomar método de adquisición. Hora de la llamada, si la cola está llena, los bloques del método PUT del hilo actual, la cola de datos está vacía, toman bloques del método del hilo actual.

ThreadLocal

Se convierten en variables de subproceso local o almacenamiento local de subprocesos, el papel es proporcionar la posesión temporal y objetos que pasan al método de hilo actual.

contador CountDownLatch

java.util.current.CountDownLatch contador, correspondiente a un contador inverso, para coordinar múltiples hilos de ejecución. Varios subprocesos que llaman su contador compartida, el método de cuenta atrás () para dejar que el contador en uno. objeto CountDownLatch puede método await () de bloqueo de un hilo, contador conocido es 0.

valla CyclicBarrier

java.util.current.CyclicBarrier es un dispositivo de bloqueo de rosca reutilizable. método de formación de una valla en el código llamando await () roscado, el primero en llegar a la valla bloquearon la valla, se conoce el número específico de hilos de haber alcanzado la barrera en.

Semáforo

Se utiliza para proteger una o más recursos de acceso compartido. Interna a mantener un contador que indica el número de acceso simultáneo a los recursos compartidos. La corriente en el acceso a los recursos compartidos, primero debe adquirir un semáforo, si el valor del contador de semáforo es mayor que 1, se puede acceder, o el hilo se bloquea.

tenedor / unirse marco

La gran idea es dividir la tarea varias pequeñas tareas, mejorar la velocidad de procesamiento tareas.

ForkJoinPoll

Se dedica a la ejecución de ForkJoinTask grupo de subprocesos, y ForkJoinTask se utiliza paquete puede dividir el objeto de tarea, sus dos subclases RecursiveAction y RecusiveTask respectivamente, para el objeto de tarea y devuelve un valor de ningún objeto de tarea valor de retorno.

Con el fin de mejorar la eficiencia de procesamiento multi-hilo, para evitar la inanición, Java del tenedor / unirse marco utiliza un método llamado "trabajo de robo" de. Cada hilo tiene su propia tarea de rosca de doble extremo cola de tareas se pone a la cabeza en circunstancias normales, cuando una cola de tareas está vacío, se va a tratar de "robar tarea" para realizar tareas de otros hilos de la cola de la cola.

 

Ejecutores modelo de fábrica usando las cuatro clases de grupo de subprocesos para lograr, tenemos que combinar el escenario del mundo real en un entorno de producción cuando está en uso. Pero no recomiendo su uso, debido a la posibilidad de utilizar clase de fábrica Ejecutores ofrecido, pasará por alto una gran cantidad de ajustes de parámetros de grupo de subprocesos, seleccione la clase de fábrica una vez que establecer los parámetros por defecto, puede conducir fácilmente a no la configuración de parámetros de ajuste, lo que resulta en problemas de rendimiento o desperdicio de recursos.

Supongo que te gusta

Origin www.cnblogs.com/wangb0402/p/12655508.html
Recomendado
Clasificación