A continuación se presentan preguntas populares de la entrevista relacionadas con Java Threads, que puede usar para prepararse para la entrevista.
1) ¿Qué es un hilo?
Un hilo es la unidad más pequeña que el sistema operativo puede realizar operaciones y programación. Está contenido en el proceso y es la unidad operativa real en el proceso. Los programadores pueden programar a los multiprocesadores a través de él, y puede acelerar las tareas de operación intensiva utilizando múltiples lecturas. Por ejemplo, si un hilo tarda 100 milisegundos en completar una tarea, solo se necesitan 10 milisegundos en un hilo para completar el cambio de tarea usando diez hilos. Java proporciona un excelente soporte para la multitud de lectura a nivel de idioma, y también es un buen punto de venta. Para más detalles, haga clic aquí.
2) ¿Cuál es la diferencia entre un hilo y un proceso?
Los hilos son subconjuntos de procesos. Un proceso puede tener muchos hilos, y cada hilo realiza diferentes tareas en paralelo. Diferentes procesos usan diferentes espacios de memoria, mientras que todos los hilos comparten el mismo espacio de memoria. No lo arruine con la memoria de la pila, cada hilo tiene una memoria de pila separada para almacenar datos locales. Para más detalles, haga clic aquí.
3) ¿Cómo implementar hilos en Java?
Hay dos formas en el nivel de idioma. Una instancia de la clase java.lang.thread es un hilo, pero necesita llamar a la interfaz java.lang.runnable para ejecutar. Dado que la clase de hilo en sí es la interfaz ejecutable llamada, puede heredar la clase java.lang.thread o llamar directamente a la interfaz ejecutable para anular el método run () para implementar el hilo. Para más detalles, haga clic aquí.
4) ¿Usar runnable o hilo?
Esta pregunta es un seguimiento de la pregunta anterior. Todos saben que podemos implementar hilos heredando la clase de subprocesos o llamando a la interfaz ejecutable. La pregunta es, ¿qué método es mejor? ¿En qué circunstancias debo usarlo? Esta pregunta es fácil de responder si sabe que Java no admite múltiples herencias de clases, pero le permite llamar a múltiples interfaces. Entonces, si desea heredar otras clases, por supuesto, es mejor llamar a la interfaz ejecutable. Para más detalles, haga clic aquí.
6) ¿Cuál es la diferencia entre los métodos Start () y ejecutar () en la clase de subprocesos?
A menudo se hace esta pregunta, pero aún puede distinguir la comprensión del entrevistador del modelo de enhebrado de Java de esto. El método Start () se utiliza para iniciar el hilo recién creado, y el método Run () se llama internamente, que es diferente del efecto de llamar directamente al método Run (). Cuando llame al método Run (), solo se llamará en el hilo original. Si no se inicia un nuevo hilo, el método Start () iniciará el nuevo hilo. Para más discusiones, haga clic aquí
7) ¿Cuál es la diferencia entre Runnable y llamable en Java?
Tanto las tareas ejecutables y llamables representan las tareas que se ejecutarán en diferentes hilos. Runnable ha estado disponible desde JDK1.0, y Callable se ha agregado en JDK1.5. Su principal diferencia es que el método de llamada de llamada () puede devolver valores y arrojar excepciones, mientras que el método Run () de Runnable no tiene estas funciones. Callable puede devolver un objeto futuro cargado con los resultados del cálculo. Mi blog tiene instrucciones más detalladas.
8) ¿Cuál es la diferencia entre CyclicBarrier y CountdownLatch en Java?
Tanto CyclicBarrier como CountdownLatch se pueden usar para hacer que un grupo de hilos espere otros hilos. A diferencia de CyclicBarrier, CountdownLatch no se puede reutilizar. Haga clic aquí para ver más información y código de muestra.
9) ¿Cuál es el modelo de memoria Java?
El modelo de memoria Java especifica y guía los programas Java para que se comporten determinista entre diferentes arquitecturas de memoria, CPU y sistemas operativos. Es especialmente importante en situaciones de múltiples subprocesos. El modelo de memoria Java puede garantizar que los cambios realizados por un hilo sean visibles para otros hilos, y las relaciones ocurren primero. Esta relación define algunas reglas para aclarar a los programadores en su programación concurrente. Por ejemplo, tener una relación primero asegura:
El código dentro de los hilos se puede ejecutar en secuencia, que se denomina reglas de orden del programa.
Para el mismo bloqueo, debe ocurrir una operación de desbloqueo antes de otra operación de bloqueo que ocurre en el tiempo, lo que también se llama regla de bloqueo de gestión.
La operación de escritura anterior a un volátil es antes de la próxima operación de lectura de un volátil, que también se llama regla de variable volátil.
Se debe llamar a cualquier operación dentro de un hilo después del inicio () de este hilo, también conocida como la regla de inicio del hilo.
Todas las operaciones de un hilo se terminarán antes de que termine el hilo.
La operación de terminación de un objeto debe ser después de construir el objeto, lo que también se llama regla de terminación del objeto.
Transitivo
Recomiendo encarecidamente que lea el Capítulo 16 de la "Práctica de programación de concurrencia Java" para profundizar su comprensión del modelo de memoria Java.
10) ¿Cuál es la variable volátil en Java?
Volátil es un modificador especial que solo puede ser utilizado por variables de miembros. En el caso de que los programas concurrentes de Java carecen de clases síncronas, las operaciones de lectura múltiple en las variables miembros son transparentes a otros hilos. La variable volátil puede garantizar que la próxima operación de lectura ocurra después de la operación de escritura anterior, que es la regla de la variable volátil de la pregunta anterior. Haga clic aquí para ver un contenido relacionado más volátil.
11) ¿Qué es la seguridad del hilo? ¿Es Vector una clase segura de hilo? (Ver aquí para más detalles)
Si su código está en el proceso en el que se encuentra, hay varios hilos que se ejecutan al mismo tiempo, y estos hilos pueden ejecutar este código al mismo tiempo. Si el resultado de cada ejecución es el mismo que el resultado de una ejecución de un solo hilo, y los valores de otras variables son los mismos que se esperan, es seguro de subproceso. El mismo objeto de instancia de una clase de contador segura de hilo no causará errores de cálculo cuando se use por múltiples hilos. Obviamente, puede dividir la clase de colección en dos grupos, a prueba de hilos y no seguros. Vector utiliza métodos de sincronización para lograr la seguridad de subprocesos, mientras que ArrayList similar a él no es segura de hilo.
12) ¿Qué son las condiciones de carrera en Java? Dar un ejemplo.
Las condiciones de carrera harán que ocurran algunos errores en situaciones concurrentes del programa. Cuando el subconjunto múltiple compite por algunos recursos, surgirán condiciones de carrera. Si el primer programa que se ejecutará falla y luego se ejecuta, algunos errores inciertos aparecerán en todo el programa. Tales errores son difíciles de detectar y recurrir debido a la competencia aleatoria entre hilos. Un ejemplo es el procesamiento desordenado, consulte la respuesta para más detalles.
13) ¿Cómo detener un hilo en Java?
Java proporciona una API rica, pero no proporciona una API para detener los hilos. JDK 1.0 originalmente tenía algunos métodos de control como stop (), suspender () y reanudar (), pero debido a posibles amenazas de punto muerto, se desaprecieron en las versiones de JDK posteriores. Después de eso, el diseñador de la API Java no proporcionó una forma compatible y segura de hilo de detener un hilo. Cuando se ejecuta el método run () o llamar (), el hilo finalizará automáticamente. Si desea finalizar un hilo manualmente, puede usar la variable booleana volátil para salir del bucle Run () del método o cancelar la tarea para interrumpir el hilo. Haga clic aquí para ver el código de muestra.
14) ¿Qué sucede cuando se produce una excepción cuando se ejecuta un hilo?
Esta es una pregunta de entrevista de Java muy complicada que encontré en una entrevista. En pocas palabras, si la excepción no se atrapa, el hilo dejará de ejecutarse.
Thread.ungageStExceptionHandler es una interfaz integrada para manejar excepciones no capturas que causan una interrupción repentina de hilos. Cuando una excepción no captura hace que un hilo interrumpa, el JVM usará Thread.getUncedgeExceptionHandler () para consultar el hilo que no ha sido capturado, ExceptionHandler y pasará el hilo y la excepción como parámetros al método Unsappaged Exception () del controlador para procesar.
15) ¿Cómo compartir datos entre dos hilos?
Puede hacerlo compartiendo objetos o utilizando estructuras de datos concurrentes como colas de bloqueo. Este tutorial, "Comunicación entre hilos de Java" (que implica compartir objetos entre dos hilos) utiliza los métodos de espera y notificación para implementar el modelo de consumidor del productor.
16) ¿Cuál es la diferencia entre notificar y notificar todo en Java?
Este es otro problema complicado, porque la lectura múltiple puede esperar bloqueos de monitoreo único, y los diseñadores de API de Java proporcionan algunas formas de notificarlos cuando esperan que las condiciones cambien, pero estos métodos no se implementan completamente. El método Notify () no puede despertar un hilo específico, por lo que solo funcionará cuando un hilo esté esperando. Y notifyall () despierta todos los hilos y les permite competir por los bloqueos para asegurarse de que al menos un hilo pueda continuar funcionando. Mi blog tiene información más detallada y código de muestra.
17) ¿Por qué espera, notificar y notificar a los métodos que no están en la clase de hilo?
Esta es una pregunta relacionada con el diseño que examina la percepción del entrevistador de los sistemas existentes y algo que es común pero no parece razonable. Al responder estas preguntas, debe explicar por qué tiene sentido poner estos métodos en la clase de objetos y por qué no ponerlas en la clase de hilo. Una razón obvia es que los bloqueos proporcionados por Java son a nivel de objeto en lugar de a nivel de hilo, y cada objeto tiene un bloqueo, obtenido a través de hilos. Si el hilo necesita esperar algunas cerraduras, tiene sentido llamar al método Wait () en el objeto. Si el método Wait () se define en la clase de subprocesos, no será obvio qué bloqueo está esperando el hilo. En pocas palabras, ya que espera, notifique y notifique las operaciones a nivel de bloqueo, se definen en la clase de objeto porque el bloqueo pertenece al objeto. También puede consultar este artículo para obtener más información.
18) ¿Qué es una variable de ThreadLocal?
ThreadLocal es una variable especial en Java. Cada hilo tiene una línea de hilo, lo que significa que cada hilo tiene su propia variable independiente, y las condiciones de carrera se eliminan por completo. Es una excelente manera de obtener hilos para crear objetos costosos. Por ejemplo, puede usar ThreadLocal para hacer que SimpleDateFormat sea seguro porque esa clase es costosa de crear y requiere crear una instancia diferente para cada llamada, por lo que no vale la pena usarla localmente. Si proporciona a cada hilo una copia única de variables, mejorará en gran medida la eficiencia. Primero, el número de objetos caros creados se reduce por multiplexación. En segundo lugar, obtienes seguridad de hilos sin usar sincronización o invariancia costosa. Otro buen ejemplo de las variables locales de hilo es la clase ThreadLocalRandom, que reduce el número de objetos aleatorios costosos creados en un entorno múltiple. Vea las respuestas para obtener más información.
19) ¿Qué es Futuretask?
En un programa concurrente de Java, FutureTask representa una operación asincrónica que puede cancelarse. Tiene métodos como iniciar y cancelar operaciones, consultar si las operaciones se completan y recuperando los resultados de la operación. El resultado solo se puede recuperar cuando se completa la operación. Si la operación no se ha completado, el método GET se bloqueará. Un objeto FutUreTask puede envolver objetos que llaman llamables y ejecutables. Dado que FutUreTask también llama a la interfaz Runnable, se puede enviar al Ejecutor para su ejecución.
20) ¿Cuál es la diferencia entre los métodos interrumpidos e ISInterruptedd en Java?
La principal diferencia entre interrupción () e ISinterrupted () es que el primero borrará el estado de interrupción, mientras que el segundo no lo hará. El mecanismo de interrupción de Java multithreading se implementa con identificadores internos. Llamar a thread.interrupt () para interrumpir un hilo establecerá el identificador de interrupción en verdadero. Cuando el hilo de interrupción llama al método estático. El método no estático ISInterrupted () se usa para consultar el estado de interrupción de otros hilos sin cambiar el identificador de estado de interrupción. En pocas palabras, cualquier método que arroje una Excepción InterruptedExceptual despejará el estado de interrupción. En cualquier caso, el estado de interrupción de un hilo puede ser cambiado por otras interrupciones de llamadas de hilos.
21) ¿Por qué deben llamar a los métodos esperar y notificar en un bloque sincrónico?
Esto se debe principalmente a que la API de Java obliga a esto, y si no lo hace, su código organizará una excepción de IllegalMonitorStateException. Otra razón es evitar las condiciones de la carrera entre esperar y notificar.
22) ¿Por qué debería verificar las condiciones de espera en el bucle?
Los subprocesos en el estado de espera pueden recibir alertas de error y pseudopasas. Si la condición de espera no se verifica en el bucle, el programa saldrá sin cumplir con la condición final. Por lo tanto, cuando un hilo de espera se despierta, no se puede considerar que su estado de espera original sigue siendo válido, y puede cambiar durante este período después de la llamada del método Notify () y antes de que el hilo de espera se despierta. Es por eso que usar el método Wait () en un bucle funciona mejor, puede crear plantillas en Eclipse para llamar a Wait y notificar y probarlo. Si desea obtener más información sobre este tema, le recomiendo que lea los capítulos de hilos y sincronización en el libro "Java efectivo".
23) ¿Cuál es la diferencia entre las colecciones sincrónicas y las colecciones concurrentes en Java?
Tanto las colecciones sincrónicas como las colecciones concurrentes proporcionan colecciones adecuadas seguras de subprocesos para múltiples lectura y concurrencia, pero las colecciones concurrentes son más escalables. Antes de Java 1.5, los programadores solo usaban colecciones síncronas, y cuando contribuía la concurrencia multiproceso, conduciría a la contención, obstaculizando la escalabilidad del sistema. Java5 introduce colecciones concurrentes como Concurrenthashmap, que no solo proporciona seguridad de hilos sino que también mejora la escalabilidad con tecnologías modernas como la separación de bloqueos y las zonas internas. Vea la respuesta para más detalles.
24) ¿Cuál es la diferencia entre el montón y la pila en Java?
¿Por qué esta pregunta se clasifica en las preguntas de entrevistas múltiples y concurrentes? Porque la pila es un área de memoria estrechamente relacionada con el hilo. Cada hilo tiene su propia memoria de pila, que se utiliza para almacenar variables locales, parámetros de método y llamadas de pila. Las variables almacenadas en un hilo son invisibles para otros hilos. El montón es un área de memoria común compartida por todos los hilos. Los objetos se crean en el montón. Para mejorar la eficiencia, el hilo caché A desde el montón hasta su propia pila. Si múltiples hilos usan esta variable, puede causar problemas. En este momento, la variable volátil puede desempeñar un papel, que requiere que el hilo lea el valor de la variable de la memoria principal.
Vea la respuesta para más detalles.
25) ¿Qué es una piscina de hilo? ¿Por qué usarlo?
Crear hilos requiere recursos y tiempo costosos. Si se crea un hilo solo después de que llegue la tarea, el tiempo de respuesta se volverá más largo y un proceso puede crear un número limitado de hilos. Para evitar estos problemas, se crean varios hilos para responder y procesar cuando se inicia el programa. Se llaman piscinas de hilos, y los hilos en el interior se llaman hilos de trabajadores. Comenzando con JDK1.5, la API Java proporciona el marco del Ejecutor que le permite crear diferentes grupos de subprocesos. Por ejemplo, un solo grupo de hilos, que maneja una tarea a la vez; Un número fijo de grupos de subprocesos o grupos de subprocesos de caché (un grupo de subprocesos extensible adecuado para muchos programas con tareas de corta duración). Vea este artículo para más detalles.
26) ¿Cómo escribir código para resolver los problemas del productor y el consumidor?
En realidad, muchos de los problemas de hilos que resuelve pertenecen al modelo de consumidor del productor, que es que una tarea de producción de hilos es para el consumo de otros hilos. Debe saber cómo comunicarse entre hilos para resolver este problema. El método de nivel relativamente bajo es usar Wait y notificar para resolver este problema. El método más excelente es usar Semaphore o Bloquingqueue para implementar el modelo de productor y consumidor. Este tutorial lo implementa.
27) ¿Cómo evitar los estlocks?
Deadlock en Java multithreading
Deadlock se refiere a un fenómeno de espera mutua causada por dos o más procesos durante el proceso de ejecución debido a la competencia por los recursos. Sin fuerzas externas, no podrán continuar. Este es un problema grave, porque Deadlocks hará que su programa suspenda y no pueda completar la tarea. Se deben cumplir las siguientes cuatro condiciones para la ocurrencia de puntos muertos:
Condición de exclusión mutua: un recurso solo puede ser utilizado por un proceso a la vez.
Solicitar y retener las condiciones: cuando un proceso bloquea a solicitar recursos, mantiene los recursos adquiridos.
Condiciones para no privar: los recursos obtenidos por el proceso no pueden privarse por la fuerza hasta el final del uso.
Condiciones de espera de bucle: se forma una relación de recursos de espera de bucle entre varios procesos que están conectados en la cabeza y la cola.
La forma más fácil de evitar el punto muerto es evitar las condiciones de espera de bucle, establecer banderas y ordenar todos los recursos en el sistema, y estipular que todos los recursos de aplicación de proceso deben operarse en un cierto orden (orden ascendente o descendente) para evitar los estallidos muertos. Este tutorial tiene ejemplos de código y detalles de discusión sobre la evitación de puntos muertos.
28) ¿Cuál es la diferencia entre cerraduras vivos y plazos en Java?
Esta es la extensión de la pregunta anterior. Las cerraduras vivos son similares a los puntos muertos. La diferencia es que el estado del hilo o el proceso en el bloqueo vivo cambia constantemente. Las cerraduras vivos pueden considerarse un tipo especial de hambre. Un ejemplo realista de un bloqueo vivo es cuando dos personas se encuentran en un corredor estrecho. Ambos intentan evitarse para que el uno al otro pueda pasar, pero debido a que la dirección de evitar es la misma, nadie puede pasar por el corredor al final. En pocas palabras, la principal diferencia entre un bloqueo vivo y un bloqueo muerto es que el estado del proceso anterior se puede cambiar pero no se puede continuar siendo ejecutado.
29) ¿Cómo detectar si un hilo tiene un bloqueo?
Nunca supe que realmente pudiéramos detectar si un hilo tuviera un bloqueo hasta que asistí a una entrevista telefónica. Hay un método en java.lang.thread llamado holdSlock (), que devuelve verdadero si y solo si el hilo actual posee un bloqueo para un objeto específico. Puede consultar este artículo para obtener más información.
30) ¿Cómo se obtiene la pila de hilos en Java?
Para diferentes sistemas operativos, hay múltiples formas de obtener la pila de subprocesos de los procesos Java. Cuando obtenga la pila de subprocesos, el JVM almacenará el estado de todos los subprocesos en el archivo de registro o lo llevará a la consola. En Windows, puede usar la combinación de teclas Ctrl + Break para obtener la pila de subprocesos y usar el comando Kill -3 en Linux. También puede usar la herramienta Jstack para obtenerla, que funciona en IDS de subprocesos, y puede usar la herramienta JPS para encontrar la ID.
31) ¿Qué parámetro en JVM se usa para controlar la pila de hilos con una pequeña pila
Este problema es muy simple, el parámetro -xss se usa para controlar el tamaño de la pila del hilo. Puede ver la lista de configuración de JVM para obtener más información sobre este parámetro.
32) ¿Cuál es la diferencia entre sincronizado y reentrante en Java?
Java ha podido lograr la exclusión mutua durante mucho tiempo a través de palabras clave sincronizadas, y tiene algunas desventajas. Por ejemplo, no puede expandir métodos o límites de bloqueo que no sean cerraduras, y no puede cancelar a la mitad al intentar adquirir bloqueos, etc. Java 5 proporciona controles más complejos para resolver estos problemas a través de la interfaz de bloqueo. La clase Reentrantlock implementa el bloqueo, que tiene la misma concurrencia y semántica de memoria como sincronizada y también es extensible. Puede consultar este artículo para obtener más información
33) Hay tres hilos T1, T2 y T3. ¿Cómo asegurarse de que se ejecuten en orden?
Hay muchas formas de permitir que los hilos se ejecute en un orden específico en múltiples lecturas. Puede usar el método Join () de la clase de subproceso para iniciar otro hilo en un hilo, y otro hilo completa el hilo para continuar la ejecución. Para garantizar el orden de tres hilos, debe comenzar el último primero (T3 llama T2, T2 llamadas T1), de modo que T1 se complete primero y T3 se completará el último. Puede consultar este artículo para obtener más información.
34) ¿Cuál es la función del método de rendimiento en la clase de subprocesos?
El método de rendimiento puede pausar el objeto de subproceso que ejecuta actualmente y permitir que otros hilos con la misma prioridad se ejecute. Es un método estático y solo asegura que el hilo actual cediera el uso de la CPU y no pueda garantizar que otros hilos puedan ocupar la CPU. El rendimiento de ejecución del hilo () puede ejecutarse inmediatamente después de ingresar al estado pausado. Haga clic aquí para ver más sobre el método de rendimiento.
35) ¿Cuál es la concurrencia de concurrenthashmap en Java?
Contrarrenthashmap divide el mapa real en varias partes para lograr su escalabilidad y seguridad de los hilos. Esta división se obtiene utilizando concurrencia, que es un parámetro opcional para el constructor de clase ConcurrentHashMap, con un valor predeterminado de 16, de modo que se puede evitar la contención en situaciones de lectura múltiple. Para obtener más concurrencia y cambio de tamaño interno, lea mi artículo cómo funciona concurrenthashmap en Java.
36) ¿Qué es Semaphore en Java?
Semaphore en Java es una nueva clase de sincronización, que es una señal de conteo. Conceptual, conceptualmente, Semafore mantiene un conjunto de permisos. Si es necesario, cada adquirir () se bloqueará antes de que la licencia esté disponible antes de obtenerla. Cada versión () agrega un permiso, que puede lanzar un adquirente de bloqueo. Sin embargo, sin usar el objeto de licencia real, Semaphore solo cuenta los números de licencia disponibles y toma las acciones correspondientes. Los semáforos a menudo se usan en código multiproceso, como grupos de conexión de bases de datos. Para más detalles, haga clic aquí.
37) Si envía una tarea, la cola de grupo de subprocesos está llena. ¿Qué pasa cuando sucede?
Esta pregunta es astuta y muchos programadores pensarán que la tarea se bloqueará hasta que la cola de grupo de hilos tenga espacio. De hecho, si no se puede programar una tarea para ser ejecutada, el método Subt () de ThreadPoolExeCutor lanzará una excepción de DelecheExecutionException.
38) ¿Cuál es la diferencia entre los métodos Subt () y Execute () en Java Hild Pool?
Ambos métodos pueden enviar tareas al grupo de subprocesos. El tipo de retorno del método Execute () es nulo, que se define en la interfaz del ejecutor, y el método Subt () puede devolver el objeto futuro que contiene los resultados del cálculo. Se define en la interfaz EjecutorService. Extiende la interfaz del Ejecutor. Otras clases de piscinas de hilos como Threadpoolexecutor y ProchuledThreadPoolExecutor tienen estos métodos. Para más detalles, haga clic aquí.
39) ¿Qué es un método de bloqueo?
Un método de bloqueo significa que el programa esperará a que el método se complete y no haga nada más. El método Acept () del Serversocket es esperar a que el cliente se conecte. Bloquear aquí significa que el hilo actual se suspenderá antes de que se devuelva el resultado de la llamada y no regresará hasta que se obtenga el resultado. Además, hay métodos asíncronos y sin bloqueo que regresan antes de que se complete la tarea. Para más detalles, haga clic aquí.
40) ¿Es la seguridad de Swing Spread? ¿Por qué?
Puede dar una respuesta positiva, Swing no es seguro de hilo, pero debe explicar por qué esta respuesta es incluso si el entrevistador no le preguntó por qué. Cuando decimos que Swing no es seguro de hilo, a menudo menciona sus componentes, que no se pueden modificar en múltiples subprocesos. Todas las actualizaciones de los componentes de la GUI deben completarse en los hilos AWT. Swing proporciona dos métodos de devolución de llamada sincrónicos y asincrónicos para actualizar. Haga clic aquí para ver más contenido relacionado con la seguridad de swing y hilo.
41) ¿Cuál es la diferencia entre Invokeandwait e Invokelater en Java?
La API de Swing proporciona estos dos métodos a los desarrolladores de Java para actualizar los componentes de la GUI desde el hilo actual en lugar del hilo de despacho de eventos. InvokeandWait () actualiza sincrónicamente los componentes de la GUI, como una barra de progreso. Una vez que se actualiza el progreso, la barra de progreso también debe cambiarse en consecuencia. Si el progreso es rastreado por múltiples subprocesos, entonces se llama al método InvokeEndWait () para solicitar el hilo de envío del evento para actualizar el componente en consecuencia. El método Invokelater () se llama asíncrono para actualizar el componente. Para más detalles, haga clic aquí.
42) ¿Qué métodos en la API de swing son seguros?
Esta pregunta también menciona la seguridad de swing y hilos. Aunque los componentes no son seguros de subprocesos, existen algunos métodos que se pueden llamar multirroncalmente, como Repaint () y Revalidate (). El método setText () de JTextComponent y los métodos insert () y append () de JTextArea también son seguros.
43) ¿Cómo crear un objeto inmutable en Java?
Este problema parece no tener nada que ver con el subproceso múltiple, pero la invariancia ayuda a simplificar programas concurrentes ya complejos. Los objetos inmutables se pueden compartir sin sincronización, reduciendo la sobrecarga de sincronización cuando el acceso concurrente al objeto. Sin embargo, Java no tiene la anotación @immutable. Para crear una clase inmutable, necesitamos implementar los siguientes pasos: inicializar a todos los miembros a través de un constructor, no proporcione un método Setter a la variable y declarar a todos los miembros como privados, para que no se permita a estos miembros acceder directamente. En el método Getter, no devuelva directamente el objeto en sí, sino clone el objeto y devuelva una copia del objeto. Mi artículo Cómo hacer un objeto inmutable en Java tiene tutoriales detallados, y puede estar lleno de confianza después de leerlo.
44) ¿Qué es ReadWriteLock en Java?
En términos generales, los bloqueos de lectura y escritura son el resultado de la tecnología de separación de bloqueos utilizada para mejorar el rendimiento de los programas concurrentes. ReadWriteLock en Java es una nueva interfaz agregada en Java 5. Un ReadWriteLock mantiene un par de cerraduras asociadas, una para operaciones de solo lectura y otra para escrituras. Un bloqueo de lectura puede ser sostenido por múltiples hilos de lectura al mismo tiempo sin un hilo de escritura. Los bloqueos de escritura son exclusivos, puede implementar esta regla utilizando ReEntantReadWriteLock en JDK, que admite hasta 65535 bloqueos de escritura y 65535 Lecturas de lectura.
45) ¿Qué es un bucle ocupado en múltiples lecturas?
Los bucles ocupados son cuando los programadores usan bucles para hacer un hilo que espere. A diferencia de los métodos tradicionales como Wait (), Sleep () o el rendimiento (), todos renuncian al control de la CPU, mientras que los bucles ocupados no renuncian a la CPU, solo está ejecutando un bucle vacío. El propósito de esto es preservar el caché de la CPU. En un sistema de múltiples núcleos, uno que espera que un hilo se despierte puede ejecutarse en otro núcleo, lo que reconstruirá el caché. Está disponible para evitar la reconstrucción del caché y reducir el tiempo esperando la reconstrucción. Puede consultar este artículo para obtener más información.
46) ¿Cuál es la diferencia entre variables volátiles y variables atómicas?
Esta es una pregunta interesante. Primero, la variable volátil se ve muy similar a la variable atómica, pero las funciones son diferentes. La variable volátil garantiza una relación predecesor, es decir, las operaciones de escritura ocurrirán antes de las operaciones de lectura posteriores, pero no garantiza la atomicidad. Por ejemplo, modificar la variable de conteo con volátil, entonces la operación Count ++ no es atómica. El método atómico proporcionado por la clase AtomicInteger puede hacer esta operación atómica. Por ejemplo, el método getAndincrement () realizará operaciones de incremento atómico para agregar el valor actual por uno, y otros tipos de datos y variables de referencia también pueden realizar operaciones similares.
47) ¿Qué sucede si un hilo dentro de un bloque de sincronización arroja una excepción?
Esta pregunta ha engañado a muchos programadores de Java. Si puede pensar si el bloqueo libera esta pista para responder, aún espera responderla correctamente. No importa si su bloque de sincronización sale de manera normalmente o anormalmente, los roscas adentro liberarán el bloqueo, por lo que prefiero el bloque de sincronización en comparación con la interfaz de bloqueo porque no requiere que gaste mi energía para liberar el bloqueo. Esta función se puede implementar liberando el bloque de bloqueo finalmente.
48) ¿Cuál es el bloqueo de doble verificación en el modo Singleton?
Esta pregunta a menudo se hace en entrevistas de Java, pero el entrevistador solo está satisfecho con el 50% de responder a esta pregunta. La mitad de las personas no puede escribir un bloqueo de cheques dobles y la mitad de las personas no puede decir que son peligros ocultos y cómo Java 1.5 lo corrigió. En realidad, es un método antiguo para crear singletons seguros a hilos. Cuando se crea una instancia de singleton por primera vez, trata de optimizar el rendimiento con un solo bloqueo, pero debido a que es demasiado complejo, falla en JDK1.4, y personalmente tampoco me gusta. De todos modos, incluso si no te gusta, todavía tienes que entenderlo porque a menudo se pregunta. Puede consultar cómo el bloqueo de doble verificación en Singleton funciona para obtener más información.
49) ¿Cómo crear un singleton apto a hilo en Java?
Este es un seguimiento de la pregunta anterior. Si no le gusta los bloqueos de verificación doble y el entrevistador preguntó sobre un método alternativo para crear una clase Singleton, puede usar las características de carga de la clase JVM y la inicialización de variables estáticas para crear una instancia de singleton, o usar tipos de enumeración para crear un singleton. Me gusta este método. Puede consultar este artículo para obtener más información.
50) Escribe 3 Prácticas Múltiples Multitudes que sigues
Me gusta más este tipo de problema, y creo que seguirá ciertas mejores prácticas al escribir un código concurrente para mejorar el rendimiento. Aquí hay tres mejores prácticas que creo que la mayoría de los programadores de Java deberían seguir:
Dale a tu hilo un nombre significativo.
Esto facilita encontrar errores o rastrearlos. OrderProcessor, cocador o comerciante este nombre es mucho mejor que Thread-1. Thread-2 y Thread-3. Déle al hilo un nombre relacionado con la tarea que desea completar. Todos los principales marcos e incluso JDK siguen esta mejor práctica.
Evite bloquear y reducir el alcance de la sincronización
Las cerraduras son caras y el cambio de contexto lleva más tiempo. Intente usar sincronización y bloqueos para minimizar el área crítica. Por lo tanto, prefiero los bloques de sincronización sobre el método de sincronización, lo que me da un control absoluto sobre el bloqueo.
Use más clases de sincronización y use menos espera y notifique
Primero, las clases sincrónicas de CountdownLatch, Semaphore, CyclicBarrier e intercambiador simplifican las operaciones de codificación, mientras que es difícil controlar los flujos de control complejos con Wait and Notify. En segundo lugar, estas clases son escritas y mantenidas por las mejores empresas. Continuarán optimizados y mejorados en los JDK posteriores. Usando estas herramientas de sincronización de nivel superior, su programa puede optimizarse sin ningún esfuerzo.
Use más conjuntos concurrentes y conjuntos menos sincronizados. Esta es otra práctica fácil de seguir. Los conjuntos concurrentes son más escalables que los conjuntos sincronizados, por lo que usar conjuntos concurrentes es mejor para la programación concurrente. Si necesita usar el mapa la próxima vez, primero debe pensar en usar concurrenthashmap. Mi artículo Java Concurrentes colecciones tiene una descripción más detallada.
51) ¿Cómo forzar comenzar un hilo?
Este problema es como cómo forzar la recolección de basura de Java. No hay forma de hacerlo todavía. Aunque puede usar System.gc () para realizar la recolección de basura, no se garantiza que tenga éxito. No hay forma de obligar a un hilo a comenzar en Java, está controlado por el programador de hilos y Java no publica la API relevante.
52) ¿Cuál es el marco de la bifurcación en Java?
fork join 框架是JDK7 中出现的一款高效的工具,Java 开发人员可以通过它充分利用现代服务器上的多处理器。它是专门为了那些可以递归划分成许多子模块设计的,目的是将所有可用的处理能力用来提升程序的性能。fork join 框架一个巨大的优势是它使用了工作窃取算法,可以完成更多任务的工作线程可以从其它线程中窃取任务来执行。你可以查看这篇文章获得更多信息。
53) Java 多线程中调用wait () 和sleep ()方法有什么不同?
Java 程序中wait 和sleep 都会造成某种形式的暂停,它们可以满足不同的需要。wait ()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep ()方法仅仅释放CPU 资源或者让当前线程停止执行一段时间,但不会释放锁。你可以查看这篇文章获得更多信息。