00 00Java senior de programación Java multi-roscado

1 los procesos y subprocesos

Entre la característica más grande es el soporte de Java el lenguaje para el desarrollo de múltiples hilos (uno de los pocos para apoyar lenguaje de programación multi-roscado), por lo que aprender todo el interior de la tecnología Java, si no se puede tener un concepto de multi-hilo comprensión completa y detallada entre los proyectos llevados a cabo en el futuro del proceso de diseño, diseños de acceso especialmente concurrentes serán graves defectos técnicos.

Si usted quiere saber lo que el hilo es que el primer ministro tiene que entender el concepto del proceso, en la era del sistema tradicional de DOS, que a su vez tiene una característica: si se presenta con un virus en su ordenador, a continuación, todos los programas no se ejecutará, debido a que el tradicional DOS utilizando una sola manipulación proceso, mientras que solo rasgo más importante del proceso de tratamiento, en el mismo período de tiempo sólo permite un programa en ejecución.

Más tarde, en la era de Windows comenzó un diseño multi-proceso, lo que significa que puede ejecutar varios programas simultáneamente en un periodo de tiempo, y estos programas se volverá a apoderarse de los recursos, por lo que habrá más programas en el mismo período de tiempo con el fin ejecución, pero en el mismo punto en el tiempo sólo habrá una ejecución de procesos, y la CPU tarde más multi-núcleo, ya que la CPU puede manejar más, a continuación, incluso si no hay una cantidad de proceso se produce, también se puede tener más de una velocidad de un solo núcleo de procesamiento de la CPU actualizar.

Un hilo es una más pequeña unidades de programa sobre la base del proceso de división, las discusiones se crean y utilizan sobre la base del proceso, por lo que el hilo depende del apoyo del proceso, pero la velocidad de puesta en marcha mucho más rápido que los hilos de proceso, por lo que cuando se utilizan múltiples cuando un concurrente rendimiento de procesamiento de hilo que su proceso de ejecución. Proceso se divide en el sistema operativo, y el hilo se divide en el proceso.

Java es un lenguaje de programación multihilo, por lo que cuando se realiza el acceso concurrente a Java procesamiento puede lograr un mayor rendimiento de procesamiento. Si se trata de lograr la definición de múltiples hilos en Java, entonces tenemos que tener un hilo dedicado principales clases se definen las discusiones de la misión, y definir el cuerpo de la clase que se requiere, se debe implementar interfaces específicas o extender específica los padres antes de que puedan completar.

2 implementa la clase Thread multithreading

Java que proporciona una java.lang.Thread de clases, siempre que tales hereda una clase dice que esta clase es el hilo conductor de la clase, pero la clase no significa que se puede lograr procesamiento multi-hilo, debido a la necesidad de cubrir escribe una carrera en la clase de hilo proporcionado por el método (public void run ()) (), y este método pertenece al método del hilo principal.
implementa la clase de rosca de herencia multithreading: Ejemplo

//实现线程的主体类,继承Thread类
//实现线程主体方法run()
class MyThread extends Thread{  //继承Thread类,实现线程的主体类
	public String title;
	
	public MyThread() {}
	
	public MyThread(String title) {
		this.title = title;
	}
	
	@Override  //实现线程主体方法run()
	public void run() {
		for(int i = 0; i < 10; i++) {
			System.out.println(this.title + "  run: i=" + i);
		}
	}
	
	
}

Multithreading funciones que deben ejercer debe ser definido en el método run (), hay que señalar que: En circunstancias normales, si se va a utilizar una clase, entonces debe producir una instancia de un objeto, y luego para llamar a la clase métodos proporcionan, pero el método run () no pueden ser llamados directamente, ya que implica la programación de recursos por lo que con el fin de iniciar el sistema operativo debe utilizar múltiples hilos start () se completa el método (público void start ()).
Ejemplo: hilos multi-start

public class ThreadDemo {

	public static void main(String[] main) {
		MyThread threadA = new MyThread("Thread-A");
		MyThread threadB = new MyThread("Thread-B");
		MyThread threadC = new MyThread("Thread-C");
		threadA.start();
		threadB.start();
		threadC.start();
	}
}

Se puede encontrar llamando en este momento, a pesar de la llamada es método start (), pero en última instancia es ejecutar el método (), y todos los objetos se alterne un trozo de ejecución. ¿Por qué no sólo tiene que utilizar un método debe utilizar el inicio de la clase Thread método () () hacen de entradas múltiples hilos corren? El siguiente es un análisis de las fuentes método start ():

public synchronized void start() {
    if (threadStatus != 0)    //线程状态判断
        throw new IllegalThreadStateException();

    group.add(this);

    boolean started = false;
    try {
        start0();  //在start()方法里面调用了start0()方法
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
           
        }
    }
}

private native void start0();  //只定义了方法名称,但是没有实现

Se encuentra dentro del método start () lanza un "IllegalThreadStateException" clase de objeto anormal, sino a todo el programa no utiliza tiros o un intento definitivo ... catch procesar porque la excepción debe ser RuntimeExcption subclase, cada clase de hilo de objetos permiten solamente una vez comenzado, si empieza a repetir esta excepción se produce, por ejemplo, el siguiente código producirá una excepción.

//重复进行线程的启动
package cn.victor.demo;

class MyThread extends Thread{  //继承Thread类,实现线程的主体类
	public String title;
	
	public MyThread() {}
	
	public MyThread(String title) {
		this.title = title;
	}
	
	@Override  //实现线程主体方法run()
	public void run() {
		for(int i = 0; i < 10; i++) {
			System.out.println(this.title + "  run: i=" + i);
		}
	}
	
	
}

public class ThreadDemo {

	public static void main(String[] main) {
		MyThread threadA = new MyThread("Thread-A");
		threadA.start();
		threadA.start();
		
	}
}

/*
Exception in thread "main"
java.lang.IllegalThreadStateException
	at java.base/java.lang.Thread.start(Unknown Source)
	at javasenior/cn.victor.demo.ThreadDemo.main(ThreadDemo.java:27)

*/

En el proceso de implementación de los programas de Java tener en cuenta los diferentes niveles de la demanda de los desarrolladores, por lo que soporta llamadas a funciones del sistema operativo local, y esto se llama la tecnología JNI (Java Native Interface), pero en el proceso de desarrollo de Java no lo recomiendan dicho uso, el uso de esta tecnología podemos utilizar algunas de las funciones del sistema operativo subyacente de algún tratamiento especial, pero start0 en la clase Thread que proporciona la () dice que este método se basa en la necesidad de una implementación de sistema operativo diferente.

En cualquier caso, siempre que la definición de un arranque de múltiples subprocesos múltiples hebras es siempre un solo programa: Método de inicio de la clase Thread ()

3 interface Runnable para lograr multi-roscado

Si bien es posible lograr multi-hilo definido por herencia hilo, pero el programa Java que siempre estará allí para la herencia la herencia simple limitado, por lo que en Java también proporciona una definición de la estructura principal de la segunda multi-threading: Implementar java.lang.Runnableinterfaz esta interfaz se define como sigue:

@FunctionalInterface  //从JDK 1.8引入Lambda表达式之后就变为了函数式接口
public interface Runnable{
    public void run();
}

Ejemplo: para lograr la clase principal multi-hilo a través de la Ejecutable

class MyThread implements Runnable{  //实现Runnable接口,实现线程的主体类
	public String title;
	
	public MyThread() {}
	
	public MyThread(String title) {
		this.title = title;
	}
	
	@Override  //实现线程主体方法run()
	public void run() {
		for(int i = 0; i < 10; i++) {
			System.out.println(this.title + "  run: i=" + i);
		}
	}
	
	
}

método, sin embargo, en este momento, ya que no es heredado de la clase padre de rosca, a continuación, para este momento de la clase MyThread ya no admiten start () heredado esto, pero si usted no utiliza hilo.start () método no es de arranque multi-hilo , así que esta vez tenemos que mirar el constructor de la clase Thread proporcionada por el.
(1) constructor: Thread pública (objetivo Ejecutable);
Ejemplo: Start multihilo

public class ThreadDemo {

	public static void main(String[] main) {
		new Thread(new MyThread("Thread-A")).start();
		new Thread(new MyThread("Thread-B")).start();
		new Thread(new MyThread("Thread-C")).start();
		
	}
}

Este multihilo tiempo que se puede encontrar, ya que sólo implementa el objeto interface Runnable, por lo que en este caso no ya no se limita a una única clase hilo principal de la herencia, a continuación, este diseño es de un diseño estándar.
Se puede encontrar desde el inicio de JDK 1.8, la interfaz runable utiliza una definición de interfaz funcional, por lo que puede utilizar directamente Lambda expresiones implementación de la clase hilo.
Ejemplo: el uso de multi-hilo Lambda

public static void main(String[] main) {
		for(int x = 0; x < 3; x++) {
			String title = "Thread-" + x;
			Runnable run = ()->{
				for(int y = 0; y < 10; y++) {
					System.out.println(title + " run: y=" + y);
				}
			};
			new Thread(run).start();
		}
	}

//*************************************
public static void main(String[] main) {
		for(int x = 0; x < 3; x++) {
			String title = "Thread-" + x;
			new Thread(()->{
				for(int y = 0; y < 10; y++) {
					System.out.println(title + " run: y=" + y);
				}
			}).start();
		}
	}

Para multi-hilo, la prioridad es lograr la interfaz Ejecutable en el futuro para desarrollar y poner en marcha un multi-hilo a través de todos los objetos clase Thread eternidad.

4 relaciones de rosca con Ejecutable

Después se puede encontrar una serie de análisis, ya tenía dos enfoques en el proceso de aplicación de múltiples hilos: clase Thread, las interfaces ejecutable, si duda el uso ejecutable desde la estructura del código en sí se refiere es la más conveniente porque evita sola Heredar limitaciones, pero también se pueden ampliar para un mejor funcionamiento.

Pero también tenemos que observar e hilo de contacto Ejecutable de la estructura, la definición de clase de hilo abierto:

public class Thread extends Object implements Runnable{}

Encuentra ahora Rosca clase es una subclase de interface Runnable, hereda el tiempo de clase Thread es el método de la interfaz Runnable () antes de que realmente sobrescribe o, por lo que este tiempo de ver la estructura de clases del programa.

diseños multiproceso, utilizando la estructura de proxy diseño de patrones, definidos por el usuario, pero el hilo principal se encarga de ejecutar las funciones básicas del proyecto, y todo dispositivo auxiliar por toda clase Thread de manejar.

Tema iniciado durante el tiempo de las llamadas multi-hilo que método start (), y luego encontrar que el método run (), cuando pasa un objeto de interfaz Ejecutable por constructor de la clase Thread, el objeto será la interfaz de la clase Thread el objetivo atributos almacenados en los ejecuta método Start () cuando la clase llama al método de rosca run (), y este método run () para llamar método de la interfaz Ejecutable subclase recubierto de ejecución por escrito ().

Multithreading es esencialmente la esencia del desarrollo es que múltiples hilos pueden agarrar los mismos recursos, entonces hilo se describe hilo principal, y la descripción del recurso se realiza a través Ejecutable.


programa de boletos utilización de recursos para implementar el acceso simultáneo de múltiples hilos: Ejemplo

package cn.victor.demo;

class MyThread implements Runnable{  //实现Runnable接口,实现线程的主体类
	private int ticket = 5;
	
	@Override  //实现线程主体方法run()
	public void run() {
		for(int i = 0; i < 10; i++) {
			if(this.ticket > 0) {
				System.out.println("sale ticket" + this.ticket--);
			}
		}
	}
	
	
}

public class ThreadDemo {

	public static void main(String[] main) {
		Runnable thread = new MyThread();
		new Thread(thread).start();
		new Thread(thread).start();
		new Thread(thread).start();
	}
}

Este procedimiento lleva a cabo para analizar la estructura de la memoria mediante el análisis de la figura.

5 multihilo interfaz invocable

Desde los más tradicionales en cuanto a si se quiere desarrollar la aplicación de múltiples hebras sin duda tendrá que confiar es Ejecutable, pero interface Runnable tiene un inconveniente: Cuando el hilo está terminado no se puede obtener un valor de retorno, por lo que a partir de entonces JDK 1.5 presenta un nuevo enhebrar implementa la interfaz: interfaces de java.util.concurrent.Callable, la primera observación de la definición de interfaz:

@FunctionalInterface
public interface Callable<V>{
	public V call() throws Exception;
}

las definiciones que se puede llamar se pueden encontrar cuando se puede establecer un tipo genérico, genérico para este tipo de datos se devuelve, para que los beneficios se pueden evitar abatido trae riesgos de seguridad.

Ejemplo: Uso de Callable multiproceso-

package cn.victor.demo;

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

class MyThread implements Callable<String>{

	@Override
	public String call() throws Exception {
		for(int i =0; i < 10; i++) {
			System.out.println("Thread run " + i);
		}
		return "Thread over";
	}
	
}

public class ThreadDemo {

	public static void main(String[] main)throws Exception {
		FutureTask<String> futureTask = new FutureTask<String>(new MyThread());
		new Thread(futureTask).start();
		new Thread(futureTask).start();
		
		System.out.println(futureTask.get());
	}
}

Preguntas de la entrevista: Por favor, explique la diferencia Ejecutable y rescatable?
(1) Ejecutable en JDK 1.0 cuando la propuesta de aplicación multi-roscado de la interfaz, y Callable se pone hacia adelante después de JDK 1.5.
Entre (2) de interfaz java.lang.Runnable simplemente proporciona un método run (), y no hay valor de retorno;
(. 3) está provista de un método de interfaz java.util.concurrent.Callable call (), puede haber un valor de retorno;

Más de seis hilos estado de ejecución

Para el desarrollo de multi-hilo, el proceso de la programación es siempre de acuerdo con: la definición de las clases principales de hilo, a continuación, las clases empiezan a hilo de rosca, pero no significa que llamar al método start (), el hilo está en funcionamiento, debido a que el estado general de la rosca tiene su propio conjunto de correr.

1, un hilo de cualquier clase de objeto hilo debe ser utilizado para el embalaje, que se utiliza para iniciar el hilo Start (), pero de hecho, cuando el número de hilos de inicio se establece en un estado preparado estado, y ahora no se realiza;
2 y luego entrar en el estado listo, es necesario esperar a que la programación de recursos, cuando uno éxito la programación de subprocesos en el (método run ()) estado de funcionamiento, pero no puede hasta que todos los hilos de ejecución por la necesidad de tener medio de una pausa el estado, por ejemplo: un hilo después de realizar un período de tiempo que necesita para hacer un recurso, entonces el hilo entra en el estado bloqueado, y luego otra vez volver al estado listo;
3, cuando se acaba el método run (), de hecho, el hilo la tarea principal será terminado, por lo que entonces se puede ir directamente al estado de parada.

Publicado 77 artículos originales · ganado elogios 11 · vistas 2633

Supongo que te gusta

Origin blog.csdn.net/weixin_43762330/article/details/104703422
Recomendado
Clasificación