(10) la programación concurrente basado en el arte de la programación concurrente de Java

Introducción Tema

Los sistemas operativos modernos cuando se ejecuta un programa que va a crear un proceso. Por ejemplo, iniciar un programa Java, el sistema operativo creará un proceso de Java.
Funcionamiento de proceso del sistema es la unidad más pequeña que puede ser programado.
Un proceso puede contener varios hilos que tienen sus propios contadores de propiedad, pila, y las variables locales, y pueden tener acceso a variables compartidas.
Un hilo es la unidad más pequeña de la asignación de recursos de la CPU.

prioridad de los hilos

Los sistemas operativos modernos ejecutan la forma básica de una división de tiempo hilos de programación, el sistema operativo será la separación de un segmento de tiempo, el hilo será asignado a un número de segmentos de tiempo, segmento de tiempo del hilo actual se queda sin se produce la programación de subprocesos, y la espera de la siguiente asignación . El hilo asignado al número de intervalos de tiempo determinará el número de subprocesos para utilizar los recursos del procesador, mientras que el hilo de rosca prioridad es decidir cómo necesidad mucho o poco para asignar un poco de hilo atributos recursos del procesador.

Estado de la rosca

Nombre Estado explicación
NUEVO El estado inicial, el hilo se construye, pero también no método start () llama
RUNNABLE Estado de funcionamiento, las hebras Java en el sistema operativo está listo y en funcionamiento dos estados denominados genéricamente como "correr"
OBSTRUIDO estado de bloqueo, indica que el hilo bloqueado en el bloqueo
ESPERANDO estado de espera, indica que el hilo en un estado de espera, entrar en el estado indica que el subproceso actual que esperar a que otro hilo de arrojar alguna acción específica (notificación o interrupción)
TIME_WAITING Tiempo de espera de estado de espera, que es diferente del estado de espera, es libre de volver a una hora determinada
TERMINADO estado de terminación, indica que el subproceso actual ha terminado

Puede utilizar las herramientas jstack, hilo Ver funcionando.
Aquí Insertar imagen Descripción
Una vez creado el hilo, llamar a start () se inicia el método de funcionamiento.
Cuando el método de hilo de ejecución wait (), el hilo en un estado de espera. El hilo en una necesidad estado de espera que depender de otros hilos cuenta para poder volver al estado de ejecución y el estado de tiempo de espera de espera es equivalente sobre la base de estados de espera más el límite de tiempo de espera, el tiempo de espera que se alcance será devuelto a la operación.
Cuando el método de sincronización de subproceso de la llamada es que en la ausencia de bloqueo adquirido, el hilo entrará en el estado de bloqueo. Después de hilos de ejecución ejecutan Ejecutable () método entrará en el estado final.

Java se ejecutará el sistema operativo y listo para funcionar estado llamado dos estados se fusionaron. Cuando el estado de bloqueo cuando el estado entra en un método o bloque de código modificado palabra clave sincronizada (para obtener un bloqueo) de la rosca está bloqueado, pero el bloqueo de la cerradura interfaz java.concurrent estado hilo paquete está a la espera para el estado, porque paquete java.concurrent Lock Interface para el bloqueo de la aplicación son los métodos de clase asociado usados ​​LockSupport.

hilos Daemon

hilo de utilidad es un tipo de soporte de hilos, ya que se utiliza principalmente como una programación de las emisiones de fondo y el trabajo de incidencia. Esto significa que cuando un subproceso no Daemon no existe una Máquina Virtual de Java, la máquina virtual Java de salida. Llamando Thread.setDaemon (verdadero) hilo de utilidad para enhebrar.
Daemon atributos necesarios antes de iniciar los ajustes del hilo no se pueden establecer después de comenzar el hilo.

public class Daemon {
    public static void main(String[] args) {
        Thread thread = new Thread(new DaemonRunner(), "DaemonRunner");
        thread.setDaemon(true);
        thread.start();
    }

    static class DaemonRunner implements Runnable {
        @Override
        public void run() {
            try {
                SleepUtils.second(10);
            } finally {
                System.out.println("DaemonThread finally run.");
            }
        }
    }
}

la operación del programa daemon, no hay salida se puede ver en el terminal o línea de comando. hilo principal (hilo no Daemon) terminado como el principal método se termina después de comenzar el hilo DaemonRunner, en un momento cuando la máquina virtual Java no tiene hilos no Daemon, las máquinas virtuales necesitan para dejar de fumar. Todas las necesidades de la máquina virtual de Java hilo de utilidad para poner fin de inmediato, por lo DaemonRunner terminado inmediatamente, pero DaemonRunner en el bloque finally no se ejecuta.

Cuando la construcción de hilo de utilidad, no se puede confiar en el contenido del bloque finally para garantizar la aplicación de los recursos lógicos para limpiar o cerrar.

Iniciar y terminar el hilo

Llamando al comienzo de la rosca () para iniciar, con la carrera de ejecución () se completa método, el hilo terminará

hilo de la construcción
Iniciar un hilo

Después de la inicialización es objeto completo de hilos, llame al método start () se puede utilizar para iniciar este hilo. Significado comienzo de la rosca () método: la sincronización hilo actual informar a la máquina virtual de Java, siempre y cuando el planificador de espacio hilo debe comenzar inmediatamente llamar al método start () hilo.

interrupción

De interrupción puede ser entendido como un poco atributo hilo marcado, marcó un hilo conductor es utilizado por otro hilo era interrumpirse el funcionamiento. Al igual que otros hilos que hilo interrumpir hola, sus otros hilos (0 interrupción del hilo llamando al manejo de interrupciones
sí mismo hilo comprobando si responden de interrupción por el hilo isInterrupted método () determina si se debe realizar interrupción, también puede llamar al método estático Thred.interrupted () para interrumpir el flujo actual marcando bit se restablece. Si el hilo ya está en el fin del estado, incluso si el flujo se interrumpe, llamando al objeto hilo isInterrupted () todavía return false

La comunicación entre hilos

Hilo conductor, que tiene su propio espacio de pila, como un guión como un paso a cabo de acuerdo con los códigos establecidos paso hasta su terminación.
la palabra clave volátil, la memoria puede garantizar la visibilidad de una sola variable.
Modificado variable miembro volátil, un hilo después de los cambios en la variable volátil, la variable se actualizará esta en la memoria principal, mientras que el otro invalidación cache de procesos, otros hilos que quieran acceder a la memoria principal a las variables volátiles sólo puede ser leído.
sincronizado de palabras clave, o usando una forma de bloque síncrono por modificación del método, que asegura que sólo una entrada a la rosca a este método, o una sincronización de los bloques de código.
Cualquier objeto tiene su propio monitor
Aquí Insertar imagen Descripción

Thread.join uso ()

Si un hilo Un ejecutado Thread.Join () declaraciones:
las esperas actuales hilo A de hilo después de interrumpir el hilo () regresa de Thread.Join. hilo de rosca Además join (), también proporciona una unión (millis de largo) y se unen (millis largos, nanos int) incluye una característica de tiempo de espera de los dos métodos. Estos dos métodos de tiempo de espera dijeron que si el hilo de rosca no termina dentro de un período de tiempo de espera dado, entonces volverá a partir del método de tiempo de espera.
Ejemplos

public class Join {
    public static void main(String[] args) throws Exception {
        Thread previous = Thread.currentThread();
        for (int i = 0; i < 10; i++) { // 每个线程拥有前一个线程的引用,需要等待前一个线程终止,才能从等待中返回
            Thread thread = new Thread(new Domino(previous), String.valueOf(i));
            thread.start();
            previous = thread;
        }
        TimeUnit.SECONDS.sleep(5);
        System.out.println(Thread.currentThread().getName() + " terminate.");
    }
    static class Domino implements Runnable {
        private Thread thread;

        public Domino(Thread thread) {
            this.thread = thread;
        }
        public void run() {
            try {
                thread.join();
            } catch (InterruptedException e) {
            }
            System.out.println(Thread.currentThread().getName() + " terminate.");
        }
    }
}
main terminate.
0 terminate.
1 terminate.
2 terminate.
3 terminate.
4 terminate.
5 terminate.
6 terminate.
7 terminate.
8 terminate.
9 terminate.

Puede verse en la salida, siempre que para cada hilo para terminar el hilo precursor, cada hilo espera precursoras terminación hilo sólo después de () devuelve el método la unión, esto implica en espera / mecanismo de notificación (rosca esperar el final del precursor, receptora extremo del hilo precursor de notificación)

ThreadLocal

ThreadLocal, es decir, variable de hilo, es un objeto de ThreadLocal clave, el valor de cualquier estructura de almacenamiento de objetos. Las estructuras se envían en un hilo, que un hilo puede consultar a un valor ligado a este hilo de acuerdo con un objeto ThreadLocal. El valor puede ser ajustado por un método set (T), por debajo del hilo de corriente adquirida de nuevo por el método get valor establecido previamente ().

public class Profiler { // 第一次get()方法调用时会进行初始化(如果set方法没有调用),每个线程会调用一次 
    private static final ThreadLocal<Long> TIME_THREADLOCAL = new ThreadLocal<Long>() {
        protected Long initialValue() {
            return System.currentTimeMillis();
        }
    };

    public static final void begin() {
        TIME_THREADLOCAL.set(System.currentTimeMillis());
    }

    public static final long end() {
        return System.currentTimeMillis() - TIME_THREADLOCAL.get();
    }

    public static void main(String[] args) throws Exception {
        Profiler.begin();
        TimeUnit.SECONDS.sleep(1);
        System.out.println("Cost: " + Profiler.end() + " mills");
    }
}

salida

Cost: 1001 mills

Profiler puede ser multiplexado en la función de las estadísticas de llamadas método consume mucho tiempo, realice la operación comenzará método () antes de método de entrada, hacer final después de la llamada al método () método, la ventaja es que no llame dos métodos en un método o clase tales como en AOP (programación orientada a aspectos) y se puede realizar antes del método (), y el fin del método de ejecución () en el punto de entrada después de la llamada al método, punto de entrada de llamadas a métodos empiezan por lo que aún puede conseguir método requiere mucho tiempo.

subprocesos

Para programas de servidor se enfrentan a menudo con un corto entrante cliente (tiempo de ejecución corto, el contenido del trabajo más sencillo) tareas que requieren un procesamiento rápido del servidor y devolver los resultados. Si el servidor cada vez que recibe un mandato para crear un hilo y, a continuación, ejecutar, esto es una buena elección en la fase de prototipo, pero la cara de miles de tiempo de envío de trabajos en el servidor, si una tarea o el uso de una forma de rosca , creará decenas de miles de hilos, esto no es una opción buena. Esto es debido a que el sistema operativo será frecuente el cambio de contexto hilo, no hay razón para aumentar la carga en el sistema, y ​​la creación y desaparición de rosca están consumiendo recursos del sistema, pero también, sin duda, una pérdida de recursos del sistema.

La tecnología grupo de subprocesos de ejecución puede resolver este problema mediante una serie de número de pre-creado de hilos, y no puede crear un hilo es controlada directamente por el usuario, reutilización fija o relativamente número de hilos fijado en este contexto para completar la tarea . La ventaja de esto es que, por un lado, la eliminación de la creación frecuente hilo y desaparición de sobrecarga de recursos del sistema, por otro lado, frente a la tarea de presentar deterioro excesivo puede ser suave.

Publicado 24 artículos originales · ganado elogios 1 · visitas 542

Supongo que te gusta

Origin blog.csdn.net/qq_45366515/article/details/105153343
Recomendado
Clasificación