conocimientos básicos de hilos de Java y los conjuntos de subprocesos y preguntas de la entrevista relacionados

A concurrencia y paralelismo son similares pero distintas es decir, (micro Concept):
Parallel: se refiere a dos o más eventos ocurrir en el mismo punto en el tiempo;
concurrencia: se refiere a dos o más eventos ocurrir dentro del mismo período.

En el sistema operativo, en un entorno de multiprogramación, concurrencia se refiere a un período de tiempo en una pluralidad de programas se ejecutan simultáneamente macroscópicamente, pero un solo sistema de CPU, pero cada vez hay sólo una ejecución del programa (segmentos de tiempo ), por lo que estos programas sólo pueden ser microscópicamente realizan alternativamente en división de tiempo.
Si una pluralidad de CPU en un sistema informático, estos programas puede ejecutar concurrentemente se pueden asignar a una pluralidad de procesadores, la ejecución multi-paralelo de tareas, es decir, con cada procesador para procesar un programa puede ser ejecutado simultáneamente, de modo que, puede realizar varios programas al mismo tiempo, ya que es microscópica, por lo que nos parece que varios programas se ejecutan simultáneamente al utilizar un ordenador.
Por lo tanto, cuando usted compra una computadora para comprar como "núcleo" y más, la razón es los "procesadores de múltiples núcleos" ordenadores pueden manejar varios programas simultáneamente en paralelo, lo que mejora la eficiencia operativa del equipo.
equipo de procesador único núcleo ciertamente no puede manejar una pluralidad de tareas en paralelo, una pluralidad de tareas pueden ejecutarse simultáneamente en una sola CPU.
Del mismo modo, el hilo es el mismo, desde un punto de vista macro para entender el hilo se está ejecutando en paralelo, pero el análisis desde el punto de vista microscópica es una operación en serie, un hilo que es un hilo de ejecución cuando el sistema es sólo una CPU, hilos ejecutar múltiples hilos en un cierto orden, que llamamos esta situación se llama programación de subprocesos.
Es decir, el tiempo de CPU rebanada asigna al tiempo de ejecución de los programas respectivos (pequeña concepto).

proceso II y el hilo:
el proceso es una aplicación que se ejecuta en una memoria. Cada proceso tiene su propia pieza separada del espacio de memoria, una aplicación puede iniciar varios procesos simultáneamente. Por ejemplo, en Windows, un abc.exe de ejecución es un proceso.
En este punto, podemos tratar el problema mientras que los juegos y escuchar música, podemos diseñar en dos programas, uno dedicado a jugar, la música dedicada.
Pero aquí, si desea diseñar un juego de zombis, tengo que abrir el proceso N de múltiples funciones completas, este diseño es claramente irrazonable.
Por no hablar de la mayoría de los sistemas operativos no requieren un proceso de acceso al espacio de memoria de otros procesos, lo que significa que la comunicación entre procesos es muy conveniente.
En este punto hemos de introducir el "hilo" esta tecnología para resolver este problema.
Tema se refiere a un proceso de ejecución de la tarea (unidad de control), un proceso que al mismo tiempo se puede ejecutar múltiples hilos, tales como: software de descarga multi-roscado.
sistema que puede ejecutar varios procesos multitarea, un proceso puede realizar múltiples tareas, un proceso puede contener varios subprocesos.
Un proceso tiene al menos un hilo, con el fin de mejorar la eficiencia, puede abrir múltiples tareas en un proceso , que es multi-hilo.
Multi-proceso: el sistema operativo para ejecutar varios programas al mismo tiempo.
Multithreading: múltiples tareas que se ejecutan en el mismo proceso al mismo tiempo.
Consideramos que el Administrador de tareas en el entorno Windows:
permite múltiples tareas en el sistema operativo, cada tarea es un proceso, cada proceso se puede realizar múltiples tareas al mismo tiempo, cada tarea es un hilo.

La diferencia entre los procesos e hilos:
proceso: un espacio de memoria independiente, espacio de almacenamiento de datos (espacio de montón y espacio de pila) proceso es independiente, existe al menos un hilo.
Tema: espacio de almacenamiento dinámico es compartido, espacio de pila es independiente de los recursos consumidos hilo es también menor que el proceso, puede influir en los demás, también conocido como procesos o procesos ligeros yuanes.
Debido a que múltiples hilos en un proceso se está ejecutando al mismo tiempo, tenga en cuenta desde el punto de vista microscópico es un secuencial, todo depende de que el Programador de ejecución del hilo CPU (JVM al horario), el programador no puede controlar.
concurrencia con múltiples hilos-Podemos visto como múltiples hilos a los recursos de CPU de agarre en la actualidad, que van a venir corriendo a agarrar los recursos, sino que también creó una aleatoriedad multi-roscado.
Proceso programa Java (un programa en ejecución Java en el sistema) contiene al menos los hilos principales de recolección de basura y el hilo (hilo de fondo).
la programación de subprocesos:
la computadora por lo general tiene una sola CPU, en cualquier momento puede ejecutar una sola instrucción de computadora, cada proceso sólo obtener el derecho a utilizar la CPU para ejecutar las instrucciones.
El llamado multi-proceso de ejecutar simultáneamente, desde un punto de vista macro, de hecho, cada proceso, a su vez get el derecho de uso de la CPU, respectivamente, para llevar a cabo sus tareas.
por lo tanto, se puede ejecutar en la piscina, habrá múltiples hilos en el estado listo hasta la CPU, JVM es responsable de la programación de hilos.
JVM utiliza la programación preventiva **, ** sin tiempo compartido programación, la que pueda causar resultados al azar de la ejecución de subprocesos múltiples.

Estado de la rosca
1. Crear un nuevo estado (Nuevo):
2. estado preparado (Ejecutable)
3. estado de ejecución (Running
4. bloqueado (Bloqueado)
5. estado de muerte (Dead)
Aquí Insertar imagen Descripción
hilo sobre tres ventajas:.
Multi-threading como un multi tarea, complicada por cierto, por supuesto, que hay ventajas:
. no se puede memoria compartida entre los procesos ①, y la memoria compartida (memoria de almacenamiento dinámico) entre los hilos es muy simple
necesidad de reasignar los recursos del sistema para el proceso de creación de proceso ② sistema, crear muchos hilos son un pequeño precio, logrando así realizar múltiples tareas concurrentes, multithreading mayor eficiencia.
soporte ③ lenguaje Java en sí, una función de las capacidades de multithreading, en lugar de simplemente como una primera programación del sistema subyacente, lo que simplifica la programación multihilo.

descarga multi-hilo: puede ser entendido como un hilo es descargar un canal de archivo, multi-threading se abre simultáneamente para descargar varios canales. Cuando el servidor está disponible para su descarga utilizando el programa de descarga se comparte el ancho de banda, al mismo nivel de prioridad, el servidor total general descargará hilos por igual.
No es difícil de entender, si multi-hilo, a continuación, descargar más rápido. Ahora popular software de descarga para apoyar multi-threading.
Multihilo es para sincronizar múltiples tareas, no proporcionar programa de eficiencia, sino para mejorar la eficiencia del sistema mediante la mejora de la eficiencia del uso de los recursos.
Así que ahora cuando usted compra una computadora, usted debe buscar en el número de subprocesos de la CPU.

IV. Cómo ejecutar un proceso en el código Java

//运行一个进程
public class ProcessDemo {
    public static void main(String[] args) throws IOException {
        //方式1:Runtime类的exec方法:
        Runtime runtime = Runtime.getRuntime();
        runtime.exec("notepad");//打开一个记事本
        //方式2:ProcessBuilder的start方法:
        ProcessBuilder pb = new ProcessBuilder("notepad");//打开一个记事本
        pb.start();
    }
}

V. manera de crear hilos
① hereda la clase Thread creado
 heredando de rosca y anular su run (), el método de ejecución que se rosca a realizar tareas. Después de crear una subclase de hilos puede ser ejecutado mediante una llamada al método start ().
 Heredando la clase hilo Hilo lograr, no se puede compartir entre múltiples variables de instancia de clase hilos de rosca. (Necesidad de crear diferentes objetos de rosca, naturalmente, no compartida)

public class ThreadTest extends Thread {
    private int i = 0;

    @Override
    public void run() {
        for (; i < 50; i++) {
          System.out.println(Thread.currentThread().getName() + " is running " + i);
        }
    }

    public static void main(String[] args) {
        for (int j = 0; j < 50; j++) {
            if (j == 20) {
                new ThreadTest().start();
            }
          System.out.println(Thread.currentThread().getName() + " is running " + j);
        }
    }
}

② crear hilos a través de la clase de interfaz Ejecutable
necesidad de definir una clase que implementa el método de interfaz Ejecutable, el método de interfaz y de anulación run (), el método se ejecuta hilo de ejecución. Crear una clase de implementación Ejecutable objeto, crear un objeto Thread como un objetivo parámetro, este objeto de Tema es el objeto real. Por implementa la clase Thread interface Runnable, que es un recurso compartido de la otra.

public class RunnableTest implements Runnable {
    private int i ;
    @Override
    public void run() {
        for(;i<50;i++){
            System.out.println(Thread.currentThread().getName() + " -- " + i);
        }
    }
    public static void main(String[] args) {
        for(int i=0;i<100;i++){
            if(i==20){
                RunnableTest runnableTest = new RunnableTest() ;
                new Thread(runnableTest,"线程1").start() ;
            }
            System.out.println(Thread.currentThread().getName() + " is running " + i);
        }
    }
}

③ utilizan rescatable y Futuro crear un hilo
  hereda de la clase Thread y poner en práctica Ejecutable se puede ver, lo anterior dos métodos no se puede tener un valor de retorno, y no se puede iniciar la excepción. Y esto se consigue de dos interfaces se puede llamar, interfaces como Callable ascendieron interfaz runable, que proporciona un método Call () como hilos ejecutables, permitiendo al mismo tiempo un valor de retorno.
  Pero rescatable objeto no puede ser utilizado directamente como objeto Thread objetivo, porque la interfaz invocable es una nueva interfaz de Java 5, no la interfaz Ejecutable sub-interfaz. La solución a este problema, en la introducción de la interfaz de futuro que puede aceptar el valor de retorno de llamada (), la interfaz de RunnableFuture es una interfaz Ejecutable sub-interfaz de interfaces de futuras y puede ser utilizado como objeto Thread objetivo. Y, la interfaz Futuro ofrece una clase de implementación: FutureTask.
  FutureTask dio cuenta de interfaces de RunnableFuture se pueden utilizar como objeto Thread objetivo.

public class CallableTest {
    public static void main(String[] args) {
        CallableTest callableTest = new CallableTest() ;
        //因为Callable接口是函数式接口,可以使用Lambda表达式
        FutureTask<Integer> task = new FutureTask<Integer>((Callable<Integer>)()->{
            int i = 0 ;
            for(;i<100;i++){
                System.out.println(Thread.currentThread().getName() + "的循环变量i的值 :" + i);
            }
            return i;
        });
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+" 的循环变量i :" + i);
            if(i==20){
                new Thread(task,"有返回值的线程").start();
            }
        }
        try{
            System.out.println("子线程返回值 : " + task.get());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

④ por ejemplo mediante el uso de un grupo de subprocesos marco Ejecutor
mayor ventaja marco Ejecutor 1.5 se introduce después de la presentación y de desacoplamiento de realizar tareas. La gente simplemente quiere realizar una descripción de tareas tarea con claridad, a continuación, se someten. Esta es la forma de tareas a ejecutar, por el cual se ejecuta, cuando se ejecuta, presentado no importa nada. punto específico de hablar, presentar un objeto que se puede llamar a la ExecutorService (como la mayor parte de la piscina ThreadPoolExecutor hilo común), obtendrá un objeto futuro, como el futuro método de objeto espera a los resultados de tener suficiente. Ejecutor marco interior usando el mecanismo de agrupación de hebras, que en java.util.cocurrent paquete iniciar roscas controladas por el marco, y realiza cerrado, la operación de programación concurrente puede simplificarse. Por lo tanto, después de Java 5, para iniciar el tema Mensajes del comienzo mejor que usar métodos Ejecutor, además más fáciles de manejar, una mejor eficiencia (con la aplicación del grupo de subprocesos, ahorro de costes), no es el punto clave: Esto ayuda a evitar escapar pregunta - si comenzamos un hilo en el constructor, porque otra tarea puede empezar antes del final del constructor, esta vez puede tener acceso a la mitad de los objetos inicializados con el Ejecutor en el constructor.

marco ejecutor incluyen: el grupo de subprocesos, ejecutor, ejecutores, ExecutorService, CompletionService , Futuro, que se puede llamar y así sucesivamente.
Los define la interfaz Ejecutor un método de ejecución (comando Ejecutable), el método recibe un ejemplo runable, que se utiliza para realizar una tarea, la tarea que es una clase que implementa la interfaz Ejecutable. interfaz ExecutorService hereda de interfaz Ejecutor, que proporciona una manera de lograr una más rica multi-hilo, por ejemplo, proporciona una ExecutorService cerrado métodos propios, así como pista una o más tareas asíncronas producir un métodos futuros. ExecutorService puede llamar al método shutdown () para sin problemas cerca ExecutorService, después de que el método se llama, que daría lugar a la parada ExecutorService aceptar cualquier nueva tarea y esperar a que la ejecución de tareas ha sido presentado al completo (la tarea se ha presentado se divide en dos categorías: una es ya en la ejecución, y el otro aún no se ha iniciado la ejecución), cuando todas las tareas que se han presentado se terminó serán ExecutorService cerrado. Por lo tanto, en general, utilizar esta interfaz para implementar y gestionar múltiples hilos.
ExecutorService ciclo de vida incluye tres estados: carrera, se cierra terminados. Creado después de entrar en estado de ejecución, cuando se llama al método shutdown (), entrará en el estado de desconexión, en este medio tiempo que ExecutorService ya no aceptan las nuevas tareas, pero se ha presentado en la ejecución de la tarea, cuando se ha presentado conocidos después de la ejecución de la tarea, que alcancen el estado final. Si usted no llama método de apagado (), ExecutorService habría estado en un estado de ejecución, recibiendo constantemente nuevas tareas, nuevas tareas, el servidor por lo general no es necesario cerrarlo, para mantener un tramo recto.
Executors proporciona una gama de métodos de fábrica para crear las han alcanzado interfaz ExecutorService primera piscina hilo grupo de subprocesos devoluciones.
ExecutorService newFixedThreadPool (nThreads int) public static
grupo de subprocesos que crea un número fijo de hilos.
public static ExecutorService newCachedThreadPool ()
crea un grupo llamado hilo de rosca en caché para ejecutar reutilizará previamente construido (si el hilo está disponible). Si un tema existente no está disponible, se crea un nuevo hilo y se añade a la piscina. Terminar y eliminar esos hilos que no se han utilizado durante 60 segundos desde la caché.
public static ExecutorService newSingleThreadExecutor ()
para crear un único ejecutor roscado.
public static ScheduledExecutorService newScheduledThreadPool (int corePoolSize)
para crear un grupo de subprocesos para apoyar la ejecución de la tarea regular y periódica, se puede utilizar para sustituir la clase Timer en la mayoría de los casos.
Executors Estos cuatro métodos se utilizan en el ThreadFactory hilo establecido, los siguientes cuatro métodos anteriores para ser comparados

newCachedThreadPool () De tipo caché piscina, compruebe primero el grupo de subprocesos se ha establecido ningún anteriormente, y si es así, en la reutilización. Si no es así, construir un nuevo hilo para unirse a un grupo de búfer corta tipo de tarea asíncrona comúnmente utilizado para llevar a cabo algún tipo de supervivencia estanque y, por tanto, no demasiados en número de servidor de tipo daemon con orientado a la conexión. Pero para la tarea asíncrona supervivencia a corto plazo, es la primera opción de Ejecutor. Puede reutilizar los hilos en el grupo de subprocesos debe ser timeoutDLE, el tiempo de espera por defecto es 60, de largo más allá de la DLE, ejemplo hilo se dará por terminado y se retira de la piscina. Tenga en cuenta que se enrosca en CachedThreadPool tiene que preocuparse de su final, más de espera de inactividad, automáticamente se dará por terminado
newFixedThreadPool (int) newFixedThreadPool y cacheThreadPool casi tan bien como ser capaz de volver a utilizarlo con, pero no está listo para construir un nuevo hilo de su singularidad: en cualquier punto en el tiempo, sólo puede tener un número fijo de hebras activas existen en este momento si hay un nuevo hilo que ser creado, sólo ponen en otra de espera en la cola hasta que el hilo actual, un subproceso termina directamente de los diferentes estanque y cacheThreadPool, FixedThreadPool ningún mecanismo IDLE (pueden tener, pero ya que el documento no mencionó, deben ser muy largo, la dependencia TC superior similar o mecanismo UDPDLE y similares), así FixedThreadPool más estable para algunos hilos concurrentes fijos muy, muy formales, y más a partir del código fuente para el método de servidor de ver, piscina caché y las llamadas fondo fijo es el mismo conjunto subyacente, pero con diferentes parámetros: fondo fijo de hilos un número fijo, y es 0 segundos IDLE (sin
newScheduledThreadPool (int) Programación de este grupo de subprocesos grupo de subprocesos tipo puede a su vez la ejecución de retardo por horario, o de ejecución del ciclo
- -
SingleThreadExecutor () realización de un solo hilo, la piscina en cualquier momento sólo un hilo con el fondo fijo y la piscina y la memoria caché el mismo conjunto subyacente, pero el número de hilos es 1-1,0 segundos IDLE (sin IDLE)

En general, CachedTheadPool crea normalmente durante la ejecución del programa con el mismo número de hilos es necesario, y luego se detiene cuando se recuperó el hilo de edad crea un nuevo hilo, por lo que es una opción razonable para el Ejecutor sólo si este enfoque puede causar problemas (por ejemplo, se requiere una gran cantidad de hilos cuando orientado a la conexión de largo), la única necesidad de considerar FixedThreadPool.
Ejecutor ejecutan tareas ejecutables
consiguen ejemplo ExecutorService por los ejecutores del método de fábrica más de cuatro estática, a continuación, llama al método ejecutar (comando Ejecutable) de la instancia pueden ser. Una vez tarea Ejecutable pasa a ejecutar el método (), en el que un hilo en forma automática

public class TestCachedThreadPool {
    public static void main(String[] args){
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 5; i++){
            executorService.execute(new TestRunnable());
            System.out.println("************* a" + i + " *************");
        }
        executorService.shutdown();
    }
}

class TestRunnable implements Runnable{
    public void run(){
        System.out.println(Thread.currentThread().getName() + "线程被调用了。");
    }
}

Preguntas VI. Cara
① hilos y procesos Cuál es la diferencia?
Un proceso es un independiente (autónomo) Entorno de funcionamiento, puede ser visto como un programa o una aplicación. El hilo es una tarea llevada a cabo en el proceso. Un hilo es un subconjunto del proceso, un proceso puede tener una gran cantidad de hilos, cada hilo en paralelo para realizar diferentes tareas. Los diferentes procesos que utilizan diferentes espacio de memoria, y todos los hilos comparten un mismo espacio de memoria. No se debe confundir y memoria de pila, cada hilo tiene una memoria de pila separada se utiliza para almacenar datos locales.

inicio de la clase ②Thread () y método run () ¿Cuál es la diferencia?
de inicio de llamada () método se inicia un nuevo hilo; si es llamado directamente carrera de rosca () método, su comportamiento será el mismo que los métodos ordinarios; Para ejecutar nuestro código en un nuevo hilo, debe utilizar hilo.start () método.

③ con Ejecutable o hilo?
Todos sabemos que se puede heredar la clase Thread o llamadas de interfaz Runnable para implementar los hilos, el problema consiste en crear hilos que forma es mejor? ¿En qué circunstancias se usa? Esta pregunta es fácil de responder si sabe Java no soporta múltiples clases de herencia, pero le permite llamar a múltiples interfaces. Así que si desea heredar de otras clases, por supuesto, es llamar a la interfaz Ejecutable mejor.

④Runnable y rescatable ¿Cuál es la diferencia?
Ejecutable y rescatable representan esas tareas a realizar en diferentes hilos. Desde el principio hubo JDK1.0 Ejecutable, invocable en JDK1.5 aumentó. La principal diferencia es el método llamado rescatable () devuelve un valor y una excepción, pero el método run Ejecutable () no tienen estas características. objeto Future Callable puede devolver cargado con el resultado del cálculo.

⑤ Cuál es el marco Ejecutor?
marco ejecutor se introdujo en Java 5, ejecutor marco es un marco basado en un conjunto de tareas asíncronas llamadas ejecución de políticas, programación, ejecución y control de.
Ilimitada creación de un hilo puede causar desbordamiento de memoria de la aplicación, por tanto, crear un grupo de subprocesos es una mejor solución, ya que permite limitar el número de hilos y se pueden reciclar estos hilos. Se puede crear muy fácilmente un grupo de subprocesos utilizando el marco Ejecutor.

¿Qué clase ⑥Executors es?
Ejecutores proporciona herramientas método ejecutor, ExecutorService, ScheduledExecutorService, ThreadFactory y clases que se puede llamar. Ejecutores se pueden utilizar para crear fácilmente un grupo de subprocesos.

Publicado 99 artículos originales · ganado elogios 2 · Vistas 2619

Supongo que te gusta

Origin blog.csdn.net/weixin_41588751/article/details/105104603
Recomendado
Clasificación