Java multi-hilo 01-- la creación del hilo y la terminación, usted en varias maneras

En este artículo se iniciará comenzó a introducir el conocimiento de concurrencia relacionada con multi-hilo de Java, gracias por su preocupación y apoyo continuo. Estoy preocupado por el número de público "lado del código de Java" para aprender más conocimientos de Java-relacionado.

Manera de crear hilos

En Java, los usuarios habituales manera toman la iniciativa de crear un hilo, hay tres, a saber, clase Thread herencia , implemento Ejecutable , por Callable 和 futuro .

herencia de clases de hilo

  • Hilo subclases definidas clase y anular el método de ejecución de la clase;
  • Llamar al método del objeto hilo de inicio () para iniciar el hilo.

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).

/**
 * 通过继承Thread实现线程
 */
public class MyThread extends Thread {
    public void run() {
        System.out.println("MyThread.run()");
    }
}

MyThread myThread = new MyThread();
myThread.start();

implementar Ejecutable

  • Si la clase ya se extiende otra clase, no se extiende directamente hilo, esta vez, se puede lograr una interfaz Ejecutable;
  • Llamar al método del objeto hilo de inicio () para iniciar el hilo.
/**
 * 通过实现Runnable接口实现的线程类
 */
public class RunnableTest implements Runnable {
    @Override
    public void run() {
        System.out.println("RunnableTest.run()");
    }

    public static void main(String[] args) {
        RunnableTest runnableTest = new RunnableTest() ;
        Thread thread = new Thread(runnableTest);
        thread.start();
    }
}

Por rescatable, Futuro

Ejecutable hilo y pueden verse de dos maneras, en cualquier caso no es compatible con los valores de retorno , y no pueden declarar se produce una 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.

objeto exigible pero no directamente como un objeto Thread objetivo, podemos utilizar la clase de objeto exigible FutureTask de envases, con objeto encapsula FutureTask exigible objeto de la llamada () Devuelve el valor del método.

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class CallableTest {
    public static void main(String[] args) {
        CallableTest callableTest = new CallableTest() ;
        //因为Callable接口是函数式接口,可以使用Lambda表达式
        FutureTask<String> task = new FutureTask<Integer>((Callable<String>)()->{
          System.out.println("FutureTask and Callable");
          return "hello word";
        });

       try{
           System.out.println("子线程返回值 : " + task.get());
        } catch (Exception e){
           e.printStackTrace();
        }
    }
}

método de interrupción enhebrar

Además del final normal de la rosca también se puede terminar de una manera particular de un hilo, la terminación de rosca Hay tres formas comunes: utilizando el hilo de salida señal de salida , ** extremos método de interrupción de hilos , método Stop termina el hilo **.

Use el hilo salida de señal de salida

La forma más comúnmente utilizada de su aplicación son: la definición de un tipo de indicador booleano en el método run hilo () de acuerdo con esta bandera es verdadero o falso para determinar si a la salida, esta tarea se coloca generalmente en run ( ) de un proceso de bucle mientras que realizar.

public class ThreadSafe extends Thread {
    public volatile boolean exit = false;
    public void run() {
        while (!exit){
            //do work
        }
    }

    public static void main(String[] args) throws Exception  {  
        ThreadFlag thread = new ThreadFlag();  
        thread.start();  
        sleep(5000); // 主线程延迟5秒  
        thread.exit = true;  // 终止线程thread    
        thread.join();  
        System.out.println("线程退出!");  
    }
}

modo de interrupción para terminar un hilo

Utilice interrupción () para interrumpir el hilo, hay dos casos:

  1. El hilo se bloquea . Como SLEEP utilice, cuando la espera de bloqueo de sincronización, socket del receptor, aceptar similares, hará que el hilo se bloquea.使用 interrupt 方法结束线程的时候,一定要先捕获 InterruptedException 异常之后通过 break 来跳出循环,才能正常结束 run 方法。
public class ThreadInterrupt extends Thread {  
    public void run()  {  
        try {  
            sleep(50000);  // 延迟50秒  
        }  
        catch (InterruptedException e) {  
            System.out.println(e.getMessage());  
        }  
    }  
    public static void main(String[] args) throws Exception  {  
        Thread thread = new ThreadInterrupt();  
        thread.start();  
        System.out.println("在50秒之内按任意键中断线程!");  
        System.in.read();  
        thread.interrupt();  
        thread.join();  
        System.out.println("线程已经退出!");  
    }  
}
  1. Sin hilo está bloqueado . Uso isInterrupted () de interrupción hilos de juicio bandera para salir del bucle. Al utilizar el método de interrupción (), el indicador de interrupción se establece en true, y el uso de banderas auto-definidas para controlar el ciclo es la misma razón.
public class ThreadSafe extends Thread {
    public void run() {
        while (!isInterrupted()) { //非阻塞过程中通过判断中断标志来退出
            try {
                Thread.sleep(5*1000);//阻塞过程捕获中断异常来退出
            } catch (InterruptedException e) {
                e.printStackTrace();
                break;//捕获到异常之后,执行 break 跳出循环
            }
        }
    }
}

método stop detiene el hilo

método de paro podría verse obligado a interrumpir o suspender el hilo conductor. Podemos utilizar el siguiente código de interrumpir el hilo:

thread.stop();

Uso de parada no es segura , el punto principal impacto de la siguiente manera:

  1. Después Thread.stop () llamada a crear un hilo hilo hijo arrojará error ThreadDeatherror;
  2. Llamado a la parada de hilo hijo dará a conocer todos los bloqueos mantenidos. Haciendo que el hilo en poder de la liberación repentina de todos los bloqueos (incontrolables), entonces es posible hacer que las inconsistencias de los datos protegidos.

resumen

  • la creación del hilo : recomendado la creación de un hilo usando Ejecutable o forma en que se puede llamar, en comparación con la herencia, implementación de la interfaz puede ser más flexible, no se limita a la herencia simple de Java.
  • Enhebrar la terminación : interrumpir el hilo recomendada bandera de interrupción o terminar, de manera segura para los subprocesos de parada, conducir fácilmente a datos inconsistentes.

Supongo que te gusta

Origin www.cnblogs.com/weechang/p/12499987.html
Recomendado
Clasificación