Resumen de subprocesos de Java (1): la diferencia entre Thread y Runnable

La diferencia entre un hilo y un proceso.

  • Proceso : Un proceso es la unidad básica de asignación de recursos. Una computadora divide un determinado recurso, como un área determinada en la memoria, en un determinado proceso. Este proceso ocupa exclusivamente este recurso y no puede ser accedido por otros procesos.
  • Subproceso : el subproceso es la unidad básica de programación de la CPU. La CPU ejecuta un subproceso en un intervalo de tiempo fijo a través del método de rotación de intervalos de tiempo. Puede haber uno o más subprocesos en un proceso, que representan diferentes rutas de ejecución del programa, y ​​diferentes subprocesos en el mismo proceso comparten el mismo recurso de memoria.

2. Cómo iniciar un hilo

2.1 Subproceso/Ejecutable

2.1.1 Hilo

new Thread() {
    @Override
    public void run() {
        log("Thread run");
    }
}.start();
复制代码

producción:

Thread run
复制代码

2.1.2 A través de ejecutable

new Thread(new Runnable() {
    @Override
    public void run() {
        log("Runnable run");
    }
}).start();
复制代码

producción:

Runnable run
复制代码

2.1.3 La diferencia entre Thread y Runnable

Primer vistazo a la estructura de la interfaz Runnable

public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}
复制代码

Puedes ver que su estructura es extremadamente simple, con solo un método abstracto run().
Mire nuevamente el método start () de Thread

/**
 * Causes this thread to begin execution; 
 * the Java Virtual Machine calls the run method of this thread.
 * ...
 */
public synchronized void start() {
    ...
}
复制代码

El contenido del método start() no es muy importante para nosotros. Lo importante es el primer comentario, para iniciar el hilo, la máquina virtual java llamará al método run() después de que el hilo comience a ejecutarse, así que vamos a echa un vistazo al método run() del Thread. )

@Override
public void run() {
    if (target != null) {
        target.run();
    }
}
复制代码

El método de ejecución de Thread solo realiza un juicio nulo.Si el objetivo no está vacío, se llama al método de ejecución del objetivo, entonces cuál es el objetivo.

public Thread(Runnable target) {
    init(null, target, "Thread-" + nextThreadNum(), 0);
}
复制代码

Puede ver que este objetivo es el Runnable que pasamos en el constructor Thread, que es como comenzamos el hilo en la Sección 2.1.2.

Resumir

  1. La interfaz ejecutable es solo una interfaz normal con el método abstracto run ()
  2. La máquina virtual llamará al método de ejecución de Thread en un momento determinado después de que se inicien las llamadas al subproceso. Si la variable de destino de tipo Runnable contenida en Thread no está vacía, se llamará al método de ejecución del destino.

pensar

¿Podemos anular el método de ejecución de Thread y usar runnable? Es teóricamente posible, intentémoslo.

public static void testThreadRunnable() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            log("Runnable run");
        }
    }) {
        @Override
        public void run() {
            super.run();
            log("Thread run");
        }
    }.start();
}
复制代码

producción

Runnable run
Thread run
复制代码

可以看到实际上也是可以的,需要注意的是,我们重写的Thread的run方法需要调用 “super.run()”,只有这样Runnable里的run方法才会被调用。

Supongo que te gusta

Origin juejin.im/post/7087480615053819940
Recomendado
Clasificación