Compartir y operaciones entre Java programación concurrente ---- base de hilo, hilo

En primer lugar, el concepto básico  

1. ¿Cuál es el proceso y el hilo

El proceso es el sistema operativo unidad más pequeña para la asignación de recursos, el siguiente proceso puede tener múltiples hilos

El hilo es la unidad más pequeña de planificación de la CPU, no pueden existir independientemente del proceso, el proceso puede compartir recursos

número 2.CPU Relaciones de subprocesos y núcleos

número --cpu de núcleos en general: el número de hilos = 1: 1

Después de HyperThreading referencia Intel = 1: 2

3.CPU mecanismo de rotación tiempo

El tiempo de programación concurrente CPU mecanismo de rotación rebanada (programación RR) Blog de _Java_ Tan Qinghai -CSDN

4. paralelo y concurrente

Paralelo : mientras que el número de tareas en ejecución

por ejemplo: una máquina de café capaz de proporcionar un servicio a la gente, entonces es una serie de paralelo, si dos, entonces es el número de paralelo 2

Concurrencia : un período de tiempo capaz de realizar la tarea número

por ejemplo: una máquina de café en 10 minutos puede producir dos tazas de café, entonces podemos considerar el número de concurrentes concurrente dentro de los 10 minutos de 2

Pensamientos: JAVA razón por la introducción de la programación concurrente

1. hacer pleno uso de los recursos de CPU;

2. acelerar el tiempo de respuesta del usuario;

En segundo lugar, la comprensión de hilo en JAVA

JAVA en el hilo no sea invalidada colaboración

1.java en el programa es inherentemente multi-hilo, a continuación, iniciar un nuevo hilo que hay varias maneras?

¿Por qué Java es inherentemente multi-hilo, por lo que lo demostramos

public static void Main (args String []) {

// JAVA hilos máquina virtual System Management Interface

    ThreadMXBeanthreadMXBean = ManagementFactory.getThreadMXBean ();

// obtener sólo un hilo y la información de pila de subprocesos

    ThreadInfo [] threadInfos = threadMXBean.dumpAllThreads (falsos, false);

para (ThreadInfo ThreadInfo: threadInfos) {

System.out.println ( "[" + threadInfo.getThreadId () + "]" + threadInfo.getThreadName ());

}

}

Después de la carrera nos encontraremos en la consola para imprimir una gran cantidad de información a nuestro hilo (hilo de la información es sólo a título informativo, no es el punto)

[8] lector Comando JDWP

[7] Thread JDWP Evento ayudante

[6] JDWP Transporte Listener: dt_socket

[5] Adjuntar Listener --- volcado información hilo de rosca

[4] Dispatcher Señal

[3] Finalizer --- reciclaje subproceso de destino (rosca daemon)

[2] hilos de procesamiento --- recuperación referencia referencia de manejador

--- la principal [1] principal hilo principal

Sólo un método principal para imprimir una gran cantidad de hilo para nosotros para explicar nuestra JAVA es inherentemente colaboración multi-roscado

Varios nueva manera de iniciar un hilo

JDK notas de rosca proporcionan el código fuente

JDK nos dice que sólo hay dos maneras  

(1) se extiende Thread   

(2) implementa Ejecutable

(3.) Los implementos una Nota Callable: se devuelve valor Callable, y puede ser considerado como un Ejecutable

El siguiente es el código para lograr

public class {Theadextends Tema

@Anular

    public void run () {

System.out.println ( "heredado de hilo");

}

}

public class {Thead1implements Ejecutable

@Anular

    public void run () {

System.out.println ( "实现 Ejecutable");

}

}

public class {Thead2implements Callable

@Anular

    llamada public Object () throws Exception {

volver "para lograr que se puede llamar";

}

}

Por eso decimos rosca y Ejecutable ¿Qué diferencia hace?

1.Thead es una abstracción de la rosca, y capaz de correr es una tarea abstracta

2. Si una clase hereda de rosca, no es adecuado para el intercambio de recursos. Pero si implementa la interfaz capaz de correr, y luego compartir fácilmente los recursos.

3.Main, una instancia de los objetos de hilo son diferentes,

se extiende Tema: t.Start ();

implementos Ejecutable: nueva rosca (t) .start ();

4. Utilice el Ejecutable, el aumento de robustez del proceso, el código puede ser compartida por múltiples hilos, código y datos por separado

El grupo de subprocesos sólo puede alcanzar runable en hilo o tipo exigible, no directamente en la rosca de la herencia de clases

2. principio al final, JAVA, cómo hacer parada segura para los subprocesos que?

stop () o de interrupción (), isInterrupted (), método estático interrumpido () => Tenemos que entender estos métodos

stop () --- obligado a parar el subproceso actual

Podemos ver el método de paro Tema código fuente está marcada etiqueta obsoleta, que muestra JDK nos dice que no es recomendable, ya que viene con una acción positiva, y no podemos garantizar el hilo de seguridad y recuperación de recursos

interrupción () --- hilo notificación de interrupción (de hecho, fijar el hilo de interrupción bandera)

Podemos pensar es nuestro hilo saludar, a decir del hilo actual a tope, pero no para el descanso forzado, decidir si interrumpir su propio hilo

isInterrupted () --- determinar si el hilo actual se interrumpe 

Se utiliza generalmente para determinar si las operaciones en el método run hilo

interrumpida () --- un hilo para indicador de interrupción

También se puede utilizar para determinar si el hilo se ha interrumpido, pero interrumpirá bandera de verdadero a falso

* necesita ser realizada método Thread.currentThread () utilizado en el ejecutable, para obtener el hilo actual, Ejecutable no proporcionado en el método anterior

* Cuando método de bloqueo lanza InterruptedException, no se interrumpirá el hilo, necesitamos método de re-llamada manualmente interrupción () en la captura

* Temas en el punto muerto no se molestarán interrumpido

En tercer lugar, en Java hilo un poco más de comprensión

El hilo del ciclo de vida

1. El estado de los métodos comunes de hilo e hilo

La comprensión en profundidad de run () y start ()

método run () para el hilo de ejecución del método de negocio, después de la ejecución de la muerte

start () un hilo en el estado preparado (estado ejecutable), cada hilo puede ser llamado una sola vez, la rotación de espera segmento de tiempo, cuando se asigna el tiempo de CPU puede entrar en el estado de ejecución

espera función () es permitir que el hilo actual en un estado de espera, al mismo tiempo, wait () también hace que las emisiones actuales del hilo de bloqueo que contiene. "Hasta otro hilo invoca los del objeto notifiquen método () o el método notifyAll ()", el subproceso actual despierta (en el "estado listo")

Papel notificar () y notifyAll (), que es una llamada de espera de hilos sobre el tema de la corriente; notificar () es para despertar un solo hilo, notifyAll () es un despertador todos los hilos

espera (tiempo de espera) de modo que el hilo actual en una "espera (bloqueo) del estado", "hasta que otro invoca el hilo de los años objeto de notificar () o el método notify (), o una cantidad especificada de tiempo" y el subproceso actual se despierta (para entrar " estado de listo ")

método Thread.yield hilo Java (), las concesiones de rosca traducidos. Después de que el nombre sugiere, que cuando un hilo se utiliza este método, que poseerá el tiempo de ejecución de la CPU para dejar salir, vamos a sí mismo oa otros hilos de ejecución, es a prestar atención a su propio u otros hilos de ejecución, no simplemente para dar otros hilos .

El papel de rendimiento () es una concesión. Permite que el hilo actual "estado de funcionamiento" en un "estado listo", de modo que otros hilos de espera con la misma prioridad en el acceso al poder ejecutivo; después, sin embargo, no garantiza que el hilo actual exige rendimiento (), el otro con la misma prioridad el hilo podría no ser capaz de obtener la ejecución correcta; también es posible que el hilo actual ha entrado en el "estado de funcionamiento" continúa funcionando

El papel de rendimiento () sólo se deja salir de la CPU, no hace que el bloqueo

unirse método (), la ejecución derecho adquirido, de manera que el hilo puede ser ejecutado de forma secuencial, a partir de los cambios paralelos en serie

setPriority () método, prioridades establecidas, nivel de prioridad java se divide en 1-10, por defecto es 5, pero no puede garantizar prioridad orden de ejecución hilo, el orden es determinado por la CPU real  

hilo Daemon, un hilo a las principales perecen hilo, sirviendo el hilo principal, tales como hilos de GC, nuevo hilo son usuarios de hilo (hilo no daemon)

setDaemon (boolean en) fijar un hilo de utilidad, el valor predeterminado es falso, verdadero hilo daemon

* Nota: hilo de guarda finalmente no necesariamente jugar un papel, upu intervalo de tiempo asignado a implementar, sería no ejecuta totalmente determinado por el programador del sistema operativo

En cuarto lugar, compartido entre hilos

1.synchronized palabra clave (el bloqueo incorporado)

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. Sin embargo, cada hilo conductor, si se ejecuta de manera aislada solamente, entonces hay poco valor, o vale muy poco, si varios subprocesos pueden cooperar entre sí para completar el trabajo, incluido el intercambio de datos entre los acuerdo de colaboración con las cosas. Esto traerá un enorme valor. de apoyo Java múltiples subprocesos tienen acceso a las variables miembro de un objeto u objetos, las palabras clave pueden modificarse método sincronizado o en forma de bloques de sincronización a uso, es principalmente para asegurar que los hilos de rosca múltiples al mismo tiempo, sólo un hilo en un método o bloque de sincronización, que asegura la visibilidad y los hilos exclusivos de acceso a variables, también conocida como la incorporada en el mecanismo de bloqueo.

Objetos y clases bloqueo bloqueos : bloquear un objeto para una instancia de objeto, o en el caso de un objeto, la cerradura de clase de objeto es un método estático en una clase o de una clase para la clase. Sabemos que la clase de instancias de objetos pueden ser muchas, pero cada clase tiene sólo un objeto de la clase, el bloqueo de objetos a diferentes instancias de objetos interfieren entre sí, pero cada clase tiene sólo una cerradura clase. Pero una cosa debe tenerse en cuenta que, de hecho, no es sólo algo así como un bloqueo en un concepto que no es cierto, de hecho, como el bloqueo de la cerradura está la clase correspondiente de objetos de cada clase. Cerraduras y el bloqueo entre los objetos no interfieren

Utilidad y uso

(1) de bloqueo Method (método de sincronización), bloques de sincronización

pública sincronizado incCount2 void () {count ++;}

incCount3 public void () { 

 sincronizado (este) { 

 contar ++; 

 }

}

(2) bloqueo de objetos

Objectobj privada = new Object (); // como una cerradura

incCount public void () { 

 sincronizado (obj) { 

 contar ++; 

 }

}

(3) en la cerradura

pública sincronizado incCount4 static void () {count ++;}

* Nota: sincronizada objeto de bloqueo debe asegurar que el bloqueo del objeto no se puede cambiar

mecanismo de sincronización 2.volatile más ligero

volátil asegurar la visibilidad cuando diferentes hilos a esta operación variables, que es un hilo modifica el valor de una variable, este nuevo valor a otro hilo es inmediatamente visible

hilo volátil no puede garantizar la seguridad de los datos escritos en múltiples hilos simultáneamente

Los mayoría de los escenarios aplicables volátiles: una escritura hilo, leen múltiples hilos

Análisis 3.ThreadLocal

(1) En comparación con el synchonized

ThreadLocal y sincronizado se utilizan para resolver el acceso simultáneo de múltiples subprocesos. Pero ThreadLocal y sincronizado naturaleza de la diferencia. sincronizado con el mecanismo de bloqueo, el bloque de código variable a la vez, o que sólo un hilo acceso lata. El ThreadLocal para cada hilo proporciona una copia de la variable de modo que cada hilo a la vez a la visita no es el mismo objeto, aislando así los datos compartidos por múltiples hilos de datos

transacción de la primavera ayudará a la clase ThreadLocal. Primavera obtendrá una conexión de la agrupación de conexiones de base de datos, y se coloca en una conexión ThreadLocal, y hay un hilo de ruedas

Mientras la conexión conseguir operado desde un ThreadLocal. ¿Por qué la transacción de primavera debe depender de la clase ThreadLocal? Para JDBC, por ejemplo, un código de transacción normal, podría ser:

 DBC = newDataBaseConnection (); // Línea 1 

Connectioncon = dbc.getConnection (); // línea 2

 con.setAutoCommit (false); //// Línea 3 

con.executeUpdate (...); // línea 4 

con.executeUpdate (...); // la línea 5 

con.executeUpdate (...); // línea 6 

con.commit (); //// fila 7 

El código se puede dividir en tres partes: la fase de preparación de transacción: Línea 1 a 3 etapas de procesamiento de negocios: la primera transacción 4-6 filas comete etapa: la línea 7 se puede ver claramente, si abrimos la transacción o la aplicación de específico sql requerimos una conexión de base de datos específica. aplicaciones Ahora hemos desarrollado suelen utilizar la estructura de tres niveles, si controlamos los asuntos del código bajo el objeto DAO (DataAccessObject), en cada objeto DAO manera de abrirlos y finalización de una transacción, cuando el objeto de servicio en el DAO llamada, Si sólo una llamada DAO, para que podamos conseguir los resultados buenos, pero a menudo nuestro Servicio llamará DAO una serie de múltiples operaciones en la base de datos, entonces esta vez no podemos controlar los asuntos de la frontera, debido a que la aplicación real, el número de DAO llame a nuestro servicio es incierto, y puede variar en función de la demanda, sino también la situación puede surgir Servicio de llamada

Utilizando (2) ThreadLocal de

ThreadLocal interfaz de clase es muy simple, sólo cuatro métodos, vamos a echar un vistazo: 

• voidset (Objectvalue) establecer el valor de las variables locales hilo del hilo actual.

 • publicObjectget () devuelve el método las variables de subproceso local correspondiente a la rosca actual.

 • publicvoidremove () el valor de las variables locales del subproceso actual suprime, el propósito es reducir el uso de memoria, que es un nuevo método para JDK 5.0. Cabe señalar que, cuando el extremo del hilo, la variable local hilo debe ser automáticamente la basura, por lo que pide explícitamente este método para limpiar el hilo no se requiere variable local para operar, pero puede acelerar la recuperación de la velocidad de la memoria.

 • protectedObjectinitialValue () devuelve el valor inicial de esta variable de subproceso local, que es un método protegido, aparentemente con el fin de permitir subclases cubren diseño. Este método es un método para llamadas de demora, get llamada () o conjunto (Objeto) cuando la ejecución del hilo por primera vez, y sólo realiza una vez. El valor por defecto en los retornos directos ThreadLocal un nulo.

publicfinalstaticThreadLocal <String> RECURSOS = new ThreadLocal <String> (); recurso representa un ThreadLocal capaz de almacenar objetos de tipo String. En este momento, no importa lo que un hilo al mismo tiempo se puede acceder a la variable, se escribe a, las operaciones de lectura son seguros hilo.

 

Lo anterior sólo se representan el punto de vista del aprendizaje individual, esperamos proporcionar una referencia de aprendizaje

 

Publicado 18 artículos originales · ganado elogios 4 · Vistas 140

Supongo que te gusta

Origin blog.csdn.net/weixin_42081445/article/details/104828948
Recomendado
Clasificación