Java obtiene datos de retorno de hilo a través de devolución de llamada

1. Concepto de devolución de llamada natural y discreto

El subproceso múltiple significa que el jefe organiza a varias personas para completar el trabajo al mismo tiempo. Por supuesto, el jefe quiere saber la finalización de cada trabajo.

La idea más sencilla es sondear, es decir, de vez en cuando, el jefe pregunta a todos si su trabajo está terminado. ¿Es este método factible? Por supuesto que es factible, pero es una pérdida de tiempo para el jefe. El jefe definitivamente está descontento.

Entonces, lo que es mejor, por supuesto, todos informan después de haber completado su trabajo e informan los resultados del trabajo al jefe.

Esta forma de notificar activamente al programa principal del resultado después de que se ejecuta el hilo se llama devolución de llamada.

No se deje engañar por el término Callback aparentemente de alto nivel. De hecho, la devolución de llamada es un concepto de pensamiento muy sencillo, natural y común.

2. Método estático de devolución de llamada

Dado que los métodos estáticos son globalmente universales, podemos llamar fácilmente a los métodos estáticos en el programa principal en un hilo.

Primero mire el hilo y vuelva a llamar al método estático del programa principal después de la ejecución para decirle al programa principal el resultado de la ejecución.

/**
 * 员工:负责读取文件大小
 */
public class ReadFileMan implements Runnable {
    
    
	/**
	 * 文件名
	 */
	private String fileName;

	public ReadFileMan(String fileName) {
    
    
		this.fileName = fileName;
	}

	@Override
	public void run() {
    
    
		File f = new File(fileName);
		if (f.exists() && f.isFile()) {
    
    
			// 回调主程序的静态方法
			ReadFileBoss.knowFileLength(fileName, f.length());
		} else {
    
    
			// 回调主程序的静态方法
			ReadFileBoss.knowFileLength(fileName, f.length());
		}
	}
}

El programa principal es relativamente simple, inicie el hilo y luego espere la devolución de llamada:

/**
 * 主程序
 */
public class ReadFileBoss {
    
    
	public static void knowFileLength(String fileName, long length) {
    
    
		System.out.println("老板知道了文件[" + fileName + "]大小:" + length);
	}

	public static void main(String[] args) {
    
    
		// 启动线程
		ReadFileMan readFileMan = new ReadFileMan("D:\\temp\\1.txt");
		Thread thread = new Thread(readFileMan);
		thread.start();
		// 输出:老板知道了文件[D:\temp\1.txt]大小:6
	}
}

En el programa anterior, el jefe ReadFileBoss le dice al empleado readFileMan que lea el tamaño del archivo, y solo necesita esperar a que el empleado informe el resultado.

Para los empleados, es fácil volver a llamar al método estático del jefe directamente después de la ejecución.

3. Método de instancia de devolución de llamada

Otro método es el método de instancia de devolución de llamada. Este modelo equivale a que cada empleado tenga un gerente que es responsable de administrar el comportamiento diario de los empleados y supervisar los resultados de la ejecución. El jefe solo necesita administrar al gerente y los empleados solo deben informar al gerente.

De acuerdo, el hilo del empleado necesita saber quién es su gerente, así que modifíquelo de la siguiente manera:

/**
 * 员工:负责读取文件大小
 */
public class ReadFileMan implements Runnable {
    
    
	/**
	 * 文件名
	 */
	private String fileName;

	/**
	 * 员工需要知道自己的经理是谁
	 */
	private ReadFileManager readFileManager;

	public ReadFileMan(String fileName, ReadFileManager readFileManager) {
    
    
		this.fileName = fileName;
		this.readFileManager = readFileManager;
	}

	@Override
	public void run() {
    
    
		File f = new File(fileName);
		if (f.exists() && f.isFile()) {
    
    
			// 回调经理的实例方法
			readFileManager.knowFileLength(fileName, f.length());
		} else {
    
    
			// 回调经理的静态方法
			readFileManager.knowFileLength(fileName, f.length());
		}
	}
}

El gerente debe organizar a los empleados para que trabajen, y luego el gerente también debe administrar los resultados del trabajo.

/**
 * 经理
 */
public class ReadFileManager {
    
    
	/**
	 * 执行结果
	 */
	public void knowFileLength(String fileName, long length) {
    
    
		System.out.println("经理知道了文件[" + fileName + "]大小:" + length);
		System.out.println("经理根据工作情况进行进一步处理");
	}

	/**
	 * 安排工作
	 */
	public void plan() {
    
    
		// 启动线程
		ReadFileMan readFileMan = new ReadFileMan("D:\\temp\\1.txt", this);
		Thread thread = new Thread(readFileMan);
		thread.start();
	}
}

El jefe se siente aliviado y deja que el gerente se haga cargo directamente:

/**
 * 主程序
 */
public class ReadFileBoss {
    
    
	public static void main(String[] args) {
    
    
		// 把事情交给经理就行了
		ReadFileManager manager=new ReadFileManager();
		manager.plan();
		// 执行结果:经理知道了文件[D:\temp\1.txt]大小:6
	}	
}

4. Resumen

En el ejemplo anterior, se puede encontrar que es mejor dejar que el gerente administre, porque cada gerente puede administrar a varios empleados (varios hilos de empleados llaman a una instancia de gerente); cada empleado también puede reportar a varios gerentes ( El empleado guarda la lista de administradores de devolución de llamada); esto es muy flexible.

Deje que una instancia administre el hilo, puede realizar varias lógicas de administración, fáciles de expandir y más en línea con la idea de la programación orientada a objetos.

Por lo tanto, se recomienda utilizar la devolución de llamada del método de instancia para obtener datos del hilo.

Supongo que te gusta

Origin blog.csdn.net/woshisangsang/article/details/107399610
Recomendado
Clasificación