Este artículo lo ayuda a dominar los conocimientos básicos de Java Multithreading para corresponder a los problemas que encuentra en el futuro. El contenido específico es el siguiente
1. Preguntas de entrevista multiproceso de Java
1. ¿Cuál es la diferencia entre un proceso y un hilo?
Un proceso es un entorno de ejecución autónomo, que puede considerarse como un programa o una aplicación. Un hilo es una tarea que se ejecuta en un proceso. El entorno de tiempo de ejecución Java es un proceso único que contiene diferentes clases y programas. Los hilos se pueden llamar procesos livianos. Los subprocesos requieren menos recursos para crear y residir en el proceso y pueden compartir recursos en el proceso.
2. ¿Cuáles son los beneficios de la programación múltiple?
En un programa de múltiples subprocesos, múltiples subprocesos se ejecutan simultáneamente para mejorar la eficiencia del programa, y la CPU no ingresará a un estado inactivo porque un cierto hilo debe esperar los recursos. Múltiples subprocesos comparten la memoria del montón, por lo que crear múltiples hilos para realizar algunas tareas es mejor que crear múltiples procesos. Por ejemplo, los servlets son mejores que CGI porque los servlets admiten múltiples lectura, mientras que CGI no.
3. ¿Cuál es la diferencia entre hilos de usuario y hilos de demonio?
Cuando creamos un hilo en un programa Java, se llama hilo de usuario. Un hilo de demonio es un hilo que se ejecuta en el fondo y no bloquea el JVM terminado. Cuando no se ejecuta ningún subproceso de usuario, el JVM cierra el programa y sale. El hilo infantil creado por un hilo de demonio sigue siendo un hilo de demonio.
4. ¿Cómo creamos un hilo?
Hay dos formas de crear subprocesos: una es implementar la interfaz ejecutable, luego pasarla al constructor de subprocesos y crear un objeto de subprocesos; El otro es heredar directamente la clase de hilo. Para obtener más información, puede leer este artículo sobre cómo crear hilos en Java.
5. ¿Cuáles son los diferentes ciclos de vida del hilo?
Cuando creamos un nuevo hilo en un programa Java, su estado es nuevo. Cuando llamamos al método Start () del hilo, el estado se cambia a Runnable. El programador de hilos asigna el tiempo de la CPU a los hilos en el grupo de hilos ejecutables y cambia su estado a ejecutarse. Otros estados de hilo incluyen espera, bloqueados y muertos. Lea este artículo para obtener más información sobre los ciclos de vida de Thread.
6. ¿Puedo llamar directamente al método Run () de la clase de subprocesos?
Por supuesto, pero si llamamos al método Run () de Thread, se comportará lo mismo que el método normal. Para ejecutar nuestro código en un nuevo hilo, se debe utilizar el método Thread.Start ().
7. ¿Cómo pausar un hilo en ejecución por un período de tiempo?
Podemos usar el método Sleep () de la clase de subprocesos para pausar el hilo por un período de tiempo. Cabe señalar que esto no hace que el hilo termine. Una vez que el hilo se despierta de la hibernación, el estado del hilo se cambiará a Runnable, y de acuerdo con la programación del hilo, se ejecutará.
8. ¿Cuál es su comprensión de la prioridad del hilo?
Cada hilo tiene prioridad. En términos generales, los hilos de alta prioridad tendrán prioridad cuando se ejecutan, pero esto depende de la implementación de la programación de subprocesos, que está relacionado con el sistema operativo (dependiente del sistema operativo). Podemos definir la prioridad de los hilos, pero esto no garantiza que los hilos de alta prioridad se ejecutarán frente a hilos de baja prioridad. La prioridad del hilo es una variable int (de 1-10), 1 representa la prioridad más baja y 10 representa la prioridad más alta.
9. ¿Qué son los programadores de hilos y el corte de tiempo?
Un programador de hilos es un servicio del sistema operativo que es responsable de asignar el tiempo de CPU a los subprocesos en estado ejecutable. Una vez que creamos un hilo y lo iniciamos, su ejecución depende de la implementación del programador de hilos. El fragmento de tiempo se refiere al proceso de asignación del tiempo de CPU disponible a los hilos ejecutables disponibles. El tiempo de CPU asignado puede basarse en la prioridad del hilo o el tiempo de espera de hilo. La programación de subprocesos no está controlada por Java Virtual Machines, por lo que es mejor controlarla mediante la aplicación (es decir, no permita que su programa dependa de las prioridades de subprocesos).
10. En la lectura múltiple, ¿qué es el cambio de contexto?
La conmutación de contexto es un proceso de almacenamiento y restauración del estado de la CPU, que permite a la ejecución de subprocesos para reanudar la ejecución de los puntos de interrupción. La conmutación de contexto es una característica básica de los sistemas operativos de varias tareas y entornos de subprocesos múltiples.
11. ¿Cómo se asegura de que el hilo donde se encuentra el método principal () es el último hilo que termina en el programa Java?
Podemos usar el método Junk () de la clase de subprocesos para garantizar que todos los subprocesos creados por el final del programa sean antes de que salga el método Main (). Aquí hay un artículo sobre el método Junk () de la clase de subprocesos.
12. ¿Cómo se comunican los hilos?
Cuando se pueden compartir los recursos entre subpuestas, la comunicación entre subproces es un medio importante para coordinarlos. El método Wait ()/notify ()/notifyall () en la clase de objeto se puede usar para comunicarse entre hilos sobre el estado de los bloqueos sobre los recursos. Haga clic aquí para obtener más información sobre Wait Wait, notify y notifyall.
13. ¿Por qué los métodos de comunicación de hilo esperan (), notificar () y notifyall () definidos en la clase de objeto?
Cada objeto en Java tiene un bloqueo (monitor, que también puede ser un monitor) y esperar (), notificar () y se utilizan otros métodos para esperar a que el bloqueo del objeto o notificar a otros objetos de subprocesos estén disponibles. No hay cerraduras y sincronizadores disponibles para ningún objeto que use en los hilos Java. Es por eso que estos métodos son parte de la clase de objetos, de modo que cada clase en Java tiene métodos básicos para la comunicación entre subpresiones.
14. ¿Por qué debe esperar (), notificar () y notifyall () ser llamado en un método de sincronización o un bloque de sincronización?
Cuando un hilo necesita llamar al método Wait () del objeto, el hilo debe tener el bloqueo del objeto. Luego libera el bloqueo del objeto y ingresa al estado de espera hasta que otros hilos llamen al método notify () en el objeto. Del mismo modo, cuando un hilo necesita llamar al método Notify () del objeto, liberará el bloqueo del objeto para que otros hilos que esperan para obtener el bloqueo del objeto. Dado que todos estos métodos requieren que los subprocesos mantengan el bloqueo del objeto, solo se pueden implementar a través de la sincronización, por lo que solo se pueden llamar en el método de sincronización o en el bloque de sincronización.
15. ¿Por qué son los métodos de sueño () y rendimiento () de la clase de hilo estática?
Los métodos Sleep () y el rendimiento () de la clase de subprocesos se ejecutarán en el hilo de ejecución actualmente. Por lo tanto, no tiene sentido llamar a estos métodos en otros hilos que están en un estado de espera. Es por eso que estos métodos son estáticos. Pueden trabajar en el hilo que se ejecuta actualmente y evitar la creencia equivocada del programador de que estos métodos pueden llamarse en otros hilos que no son de carrera.
16. ¿Cómo garantizar la seguridad del hilo?
Hay muchas maneras de garantizar la seguridad de los subprocesos en Java - sincronización, usar clases acurrentes atómicas, implementar bloqueos concurrentes, usar palabras clave volátiles, usar clases invariantes y clases seguras de hilo. Puede obtener más información en el tutorial de seguridad del hilo.
17. ¿Cuál es el papel de la palabra clave volátil en Java?
Cuando usamos la palabra clave volátil para modificar una variable, el hilo leerá directamente la variable y no la almacenará en caché. Esto asegura que las variables leídas por el hilo sean consistentes en la memoria.
18. ¿Cuál es la mejor opción, el método de sincronización o el bloque de sincronización?
Los bloques sincrónicos son una mejor opción porque no bloqueará todo el objeto (y, por supuesto, también puede dejar que bloquee todo el objeto). El método de sincronización bloquea todo el objeto, incluso si hay múltiples bloques de sincronización no relacionados en la clase, lo que generalmente hace que dejen de ejecutar y necesitan esperar para obtener el bloqueo en el objeto.
19. ¿Cómo crear un hilo de demonio?
Use el método SetDaemon (True) de la clase de subprocesos en el método Setdaemon (true) para establecer el hilo como un hilo de demonio. Cabe señalar que este método debe llamarse antes de llamar al método Start (), de lo contrario, se lanzará una IllegaltateException.
20. ¿Qué es Threadlocal?
ThreadLocal se usa para crear variables locales para hilos. Sabemos que todos los hilos de un objeto compartirán sus variables globales, por lo que estas variables no son seguras y podemos usar técnicas de sincronización. Pero cuando no queremos usar la sincronización, podemos elegir la variable ThreadLocal.
Cada hilo tendrá sus propias variables de hilo, que pueden usar el método get ()/set () para obtener sus valores predeterminados o cambiar sus valores internamente. Las instancias de Threadlocal generalmente desean que se asocien con el estado de hilo como atributos estáticos privados. En este artículo, puede ver un pequeño programa sobre ThreadLocal.
21. ¿Qué es el grupo de hilos? ¿Por qué no se recomienda?
Threadgroup es una clase cuyo propósito es proporcionar información sobre los grupos de subprocesos.
La API ThreadGroup es relativamente débil y no ofrece más funciones que Thread. Tiene dos funciones principales: una es obtener una lista de hilos activos en el grupo de subprocesos; El otro es establecer un controlador de excepciones no capturado para hilos. Sin embargo, en Java 1.5, la clase de subprocesos también agregó el método setUncUncedExceptionHandler (Unsappaging ExceptionHandler EH), por lo que el grupo de subprocesos está desactualizado y no se recomienda continuar usándolo.
t1.setUncedgeExceptionHandler (New UndingCexceptionHandler () {@Override public void Ungaging Exception (Thread t, Throwable E) {System.out.println ("Excepción ocurrió:"+E.getMessage ());}}); 22. ¿Qué es un volcado de hilo de Java y cómo conseguirlo?
El volcado de hilos es una lista de hilos activos de JVM que son muy útiles para analizar cuellos de botella y bloqueos muertos del sistema. Hay muchas maneras de obtener volcados de subprocesos: usando el comando Profiler, Kill -3, la herramienta Jstack, etc. Prefiero la herramienta Jstack porque es fácil de usar y viene con JDK. Dado que es una herramienta basada en el terminal, podemos escribir algunos scripts para generar volcados de subprocesos oportunos para el análisis. Lea este documento para obtener más información sobre cómo generar volcados de hilos.
23. ¿Qué es un punto muerto? ¿Cómo analizar y evitar los puntos muertos?
Deadlock se refiere a la situación en la que más de dos hilos están bloqueados para siempre. Esta situación requiere al menos dos hilos y más de dos recursos.
Para analizar los puntos muertos, necesitamos ver el volcado de subprocesos de la aplicación Java. Necesitamos averiguar esos hilos con el estado bloqueado y los recursos que están esperando. Cada recurso tiene una identificación única. Usando esta identificación, podemos averiguar qué hilos ya tienen su bloqueo de objeto.
Evitar los bloqueos anidados, usando solo cerraduras donde se necesitan y evitar la espera indefinida son las formas habituales de evitar los puntos de punto muertos, lea este artículo para aprender a analizar los puntos muertos.
24. ¿Cuál es la clase de temporizador de Java? ¿Cómo crear una tarea con un intervalo de tiempo específico?
java.util.timer es una clase de herramientas que se puede usar para programar un hilo para ejecutar en un momento determinado en el futuro. La clase de temporizador se puede organizar programando tareas únicas o tareas periódicas.
java.util.timerTask es una clase abstracta que implementa la interfaz ejecutable. Necesitamos heredar esta clase para crear nuestras propias tareas cronometradas y usar un temporizador para organizar su ejecución.
25. ¿Qué es una piscina de hilo? ¿Cómo crear una piscina de hilo de Java?
Un grupo de subprocesos gestiona un conjunto de hilos de trabajadores, y también incluye una cola para colocar tareas que esperan ser ejecutadas.
java.util.concurrent.executors proporciona una implementación de la interfaz java.util.concurrent.executor para crear grupos de subprocesos. El ejemplo del grupo de hilos muestra cómo crear y usar un grupo de subprocesos, o leer el ejemplo de programado de threadpoolexecutor para aprender cómo crear una tarea periódica.
2. Preguntas de entrevista concurrente de Java
1. ¿Qué es la operación atómica? ¿Qué clases atómicas hay en la API de concurrencia de Java?
La operación atómica se refiere a una unidad de tarea de operación que no se ve afectada por otras operaciones. Las operaciones atómicas son medios necesarios para evitar la inconsistencia de los datos en un entorno múltiple.
Int ++ no es una operación atómica, por lo que cuando un hilo lee su valor y agrega 1, otro hilo puede leer el valor anterior, lo que aumentará un error.
Para resolver este problema, es necesario garantizar que la operación de adición sea atómica, y podríamos usar la tecnología de sincronización para hacerlo antes de JDK1.5. Para JDK1.5, el paquete java.util.concurrent.atomic proporciona int y largos tipos de clases de carga, que pueden garantizar automáticamente que sean atómicos para sus operaciones y no requieren sincronización.
2. ¿Cuál es la interfaz de bloqueo en la API de concurrencia Java? ¿Cuáles son las ventajas de comparar la sincronización?
La interfaz de bloqueo proporciona una operación de bloqueo más escalable que el método de sincronización y el bloque de sincronización. Permiten estructuras más flexibles, pueden tener propiedades completamente diferentes y pueden soportar objetos condicionales de múltiples clases relacionadas.
Sus ventajas son:
Puede hacer que el bloqueo sea más justo, de modo que el hilo responde a las interrupciones mientras espera el bloqueo, para que el hilo pueda intentar adquirir el bloqueo, y regresar inmediatamente cuando no puede adquirir el bloqueo o esperar un período de tiempo, que se puede adquirir y liberar en diferentes órdenes en diferentes rangos.
3. ¿Cuál es el marco de los ejecutores?
El marco del ejecutor se introduce en Java 5 con la interfaz java.util.concurrent.executor. El Marco del Ejecutor es un marco que ejecuta tareas asincrónicas que ejecutan llamadas de política, programas, ejecutan y controlan de acuerdo con un conjunto de políticas.
Los hilos de creación ilimitados pueden causar desbordamiento de la memoria de la aplicación. Por lo tanto, crear un grupo de subprocesos es una mejor solución porque el número de hilos puede ser limitado y el número de hilos se puede reciclar y reutilizar. El uso del marco de los ejecutores puede crear fácilmente un grupo de subprocesos. Lea este artículo para aprender cómo usar el marco del Ejecutor para crear un grupo de subprocesos.
4. ¿Qué es una cola de bloqueo? ¿Cómo implementar un modelo de productor-consumidor utilizando colas de bloqueo?
La característica de java.util.concurrent.blockingqueue es: cuando la cola está vacía, se bloqueará la operación de obtener o eliminar elementos de la cola, o cuando la cola esté llena, se bloqueará la operación de agregar elementos a la cola.
La cola de bloqueo no acepta valores nulos, y cuando intenta agregar valores nulos a la cola, arroja una NullPointerException.
La implementación de colas de bloqueo es segura de hilo, y todos los métodos de consulta son atómicos y usan bloqueos internos u otras formas de control concurrente.
La interfaz Bloquingqueue es parte del Marco de Colecciones Java, que se utiliza principalmente para implementar problemas de productor-consumidor.
5. ¿Qué son llamables y futuro?
Java 5 presenta la interfaz java.util.concurrent.callable en el paquete de concurrencia. Es muy similar a la interfaz ejecutable, pero puede devolver un objeto o lanzar una excepción.
La interfaz invocatoria utiliza genéricos para definir su tipo de retorno. La clase Ejecutores proporciona algunos métodos útiles para ejecutar tareas dentro de un grupo de hilos. Dado que la tarea invocable es paralela, tenemos que esperar el resultado que regresa. El objeto java.util.concurrent.future resuelve este problema para nosotros. Después de que el grupo de subprocesos envía la tarea invocable, se devuelve un objeto futuro. Usándolo, podemos conocer el estado de la tarea llamable y obtener el resultado de ejecución devuelto por el llamable. Future proporciona un método get () que nos permite esperar a que el llamable finalice y obtenga su resultado de ejecución.
6. ¿Qué es Futuretask?
FutUreTask es una implementación básica del futuro, podemos usarla con los ejecutores para manejar tareas asíncronas. Por lo general, no necesitamos usar la clase FutureTask, se vuelve muy útil justo cuando planeamos reescribir algunos métodos de la interfaz futura y mantener la implementación básica original. Simplemente podemos heredar de él y reescribir los métodos que necesitamos.
7. ¿Cuál es la implementación de contenedores concurrentes?
Las clases de recolección de Java fallan rápidamente, lo que significa que cuando se cambia el conjunto y un hilo usa el iterador para atravesar el conjunto, el método iterador Next () lanzará una excepción concurrente de Modificación Excepción.
Los contenedores concurrentes admiten actualizaciones transversales y concurrentes concurrentes.
Las clases principales son concurrenthashmap, copyOnwriteArrayList y CopyOnWriteArraySet. Lea este artículo para aprender cómo evitar la Excepción de Modificación Concurrente.
8. ¿Cuál es la clase de ejecutores?
Los ejecutores proporcionan algunos métodos de herramientas para ejecutor, eCecomorservice, programado de experiencia, threadfactory y clases llamables.
Los ejecutores se pueden usar para crear convenientemente grupos de subprocesos.
De hecho, hay muchas más preguntas básicas de entrevista de Java, y puede organizarlas sistemáticamente.
¡Espero que todos tengan éxito en la entrevista!