Java usa el sondeo para obtener datos de retorno de subprocesos

1. Las características del multihilo

En los programas generales, solo hay un hilo principal, que se ejecuta secuencialmente de arriba a abajo.

Sin embargo, en un programa multiproceso, la ejecución de múltiples subprocesos es concurrente y el programador no puede predecir el tiempo de finalización de ejecución de cada subproceso en el momento del diseño.

Mire la clase de subproceso a continuación, utilizada para leer el tamaño del archivo, y luego coloque el resultado en la variable local del subproceso.

/**
* 读取文件大小
*/
public class ReadFileRunnable implements Runnable {
    
    
   /**
    * 文件名
    */
   private String fileName;

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

   /**
    * 文件大小,默认为-2
    */
   private long length = -2;

   public long getLength() {
    
    
   	return length;
   }

   @Override
   public void run() {
    
    
   	File f = new File(fileName);
   	if (f.exists() && f.isFile()) {
    
    
   		this.length = f.length();
   	} else {
    
    
   		this.length = -1;// 文件不存在
   	}
   }
}

Si sigue el pensamiento general, primero iniciamos el hilo para obtener el tamaño del archivo, y luego generamos el tamaño del archivo.

	public static void main(String[] args) {
    
    
		// 启动线程
		ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt");
		Thread thread = new Thread(writeFileRunnable);
		thread.start();
		// 输出结果
		System.out.println("length:" + writeFileRunnable.getLength());// 输出-2
	}

Después de ejecutarlo muchas veces, la salida es -2. Esto se debe a que el hilo que comenzamos aún no se ha ejecutado y la declaración que genera el resultado a continuación se ha ejecutado. Esto se debe a que el hilo que comenzamos necesita leer el archivo, que es una operación de E / S, y la velocidad debe ser relativamente lenta.

2. Utilice el sondeo para forzar una espera.

La solución más sencilla es utilizar el sondeo y comprobar siempre los resultados de la ejecución del hilo.

	public static void main(String[] args) {
    
    
		// 启动线程
		ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt");
		Thread thread = new Thread(writeFileRunnable);
		thread.start();
		// 一直等待
		while (true) {
    
    
			if (writeFileRunnable.getLength() == -2) {
    
    // 无结果
				continue;
			} else {
    
    
				System.out.println("length:" + writeFileRunnable.getLength());// 输出-2
				break;// 直到获取结果结束,此时可以输出文件大小
			}
		}
	}

3. Desventajas del sondeo

El uso de encuestas parece resolver el problema, pero en realidad es una pérdida de rendimiento. Probamos:

	public static void main(String[] args) {
    
    
		// 启动线程
		ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt");
		Thread thread = new Thread(writeFileRunnable);
		thread.start();
		// 一直等待
		int i = 0;
		while (true) {
    
    
			i++;
			if (writeFileRunnable.getLength() == -2) {
    
    // 无结果
				continue;
			} else {
    
    
				System.out.println("循环执行次数:" + i);// 循环执行次数:14365
				System.out.println("length:" + writeFileRunnable.getLength());// 输出-2
				break;// 直到获取结果结束
			}
		}
	}

En otras palabras, verificamos más de 10,000 veces, y solo una vez fue efectiva, lo cual es un gran desperdicio.

4. Resumen

En un programa multiproceso, el sondeo se puede utilizar para obtener los datos devueltos por el subproceso, pero es una pérdida de rendimiento. Este método generalmente no se recomienda.

Supongo que te gusta

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