Java utilise l'interrogation pour obtenir les données de retour de thread

1. Les caractéristiques du multi-threading

Dans les programmes généraux, il n'y a qu'un seul thread principal, qui s'exécute séquentiellement de haut en bas.

Cependant, dans un programme multithread, l'exécution de plusieurs threads est simultanée et le programmeur ne peut pas prédire l'heure de fin d'exécution de chaque thread au moment du design.

Regardez la classe de thread ci-dessous, utilisée pour lire la taille du fichier, puis placez le résultat dans la variable locale de thread.

/**
* 读取文件大小
*/
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 vous suivez la réflexion générale, nous commençons par démarrer le thread pour obtenir la taille du fichier, puis sortons la taille du fichier.

	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
	}

Après l'avoir exécuté plusieurs fois, le résultat est -2. C'est parce que le thread que nous avons démarré n'a pas encore été exécuté et que l'instruction qui produit le résultat ci-dessous a été exécutée. En effet, le thread que nous avons démarré doit lire le fichier, qui est une opération d'E / S, et la vitesse doit être relativement lente.

2. Utilisez l'interrogation pour forcer une attente

La solution la plus simple consiste à utiliser l'interrogation et à toujours vérifier les résultats de l'exécution des threads.

	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. Inconvénients des sondages

L'utilisation du sondage semble résoudre le problème, mais c'est en fait un gaspillage de performances. Nous avons testé:

	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 d'autres termes, nous avons vérifié plus de 10 000 fois, et une seule fois a été efficace, ce qui est un énorme gaspillage.

4. Résumé

Dans un programme multithread, l'interrogation peut être utilisée pour obtenir les données renvoyées par le thread, mais c'est une perte de performances. Cette méthode n'est généralement pas recommandée.

Je suppose que tu aimes

Origine blog.csdn.net/woshisangsang/article/details/107369633
conseillé
Classement