Cet article comprend une brève introduction au mécanisme de traitement asynchrone dans la programmation Java et un exemple connexe. Je pense que grâce à cet article, tout le monde peut avoir une meilleure compréhension du traitement asynchrone.
Habituellement, la synchronisation signifie qu'un certain processus de traitement d'une tâche sera traité en série par plusieurs threads, tandis que asynchrone signifie qu'un certain processus de traitement peut permettre à plusieurs threads de traiter en même temps. Jetons un coup d'œil aux détails du traitement asynchrone.
L'asynchrone représente généralement de meilleures performances, car il repose fortement sur la mise en mémoire tampon, qui est une pratique typique d'utilisation de l'espace pour le temps. Par exemple, dans les ordinateurs, le cache est utilisé comme CPU et disque IO Le tampon. La zone coordonne la puissance de calcul à grande vitesse du processeur et les capacités de lecture et d’écriture à faible vitesse du disque.
volatile
Scénario d'application : Vérifier l'arrêt d'exécution ou l'état d'interruption d'une application. Parce que ce mot-clé rejette l'optimisation virtuelle de plusieurs affectations à une variable, il garantit que la machine virtuelle vérifiera définitivement les changements d'état des variables modifiées par ce mot-clé.
CountDownLatch
Scénario d'application : contrôler que le thread actuel attend qu'un groupe d'opérations de thread soit terminé. Par exemple, l'exécution de la méthode wait() dans le thread principal bloque le thread principal et l'exécution de la méthode countDown() une fois que le thread de travail a fini d'exécuter la logique.
Exemple de scénario dans cet article :
1. Envoyer un message depuis la console vers le serveur de messages (simulé par une file d'attente).
2. Écrivez la file d'attente des messages dans le fichier (définissez un délai pour l'opération d'écriture du fichier afin de simuler le goulot d'étranglement des performances).
3. Le serveur de messages agit comme un tampon entre la console et l'écriture des fichiers.
Exemple de code :
Remarque : L'ajout de messages à la file d'attente des messages peut être ajouté simultanément via une boucle for. commodité d'observation des fichiers et des files d'attente. Le changement utilise l'entrée de la console. La vitesse d'écriture réelle d'une ligne d'enregistrement de fichier doit être supérieure à la vitesse de la main, donc le temps de veille du thread est augmenté dans l'exemple de cet article.
package org.wit.ff.ch2; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Scanner; import java.util.concurrent.BlockingQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; /** * * <pre class="brush:php;toolbar:false"> * 简单异步处理示例. ** * @author F.Fang * @version $Id: AsyncHandler.java, v 0.1 2014年10月23日 下午11:37:54 F.Fang Exp $ */ public class AsyncHandler { /** * 控制资源释放. */ private CountDownLatch latch; /** * 处理完成标识. */ private volatile boolean handleFinish; /** * 消息写入本地文件完成. */ private volatile boolean sendFinish; /** * 阻塞队列. */ private BlockingQueue
* 给出消息发送完成的标识. ** */ public void sendFinish() { sendFinish = true; } /** * *
* 资源释放. ** */ public void release() { System.out.println("release!"); if (bw != null) { try { bw.close(); } catch (IOException e) { // TODO 打印日志. } } //其实使用queue = null就够了. if (queue != null) { queue.clear(); queue = null; } } /** * *
* 往队列发送消息. ** * @param text */ public void sendMsg(String text) { if (text != null && !text.isEmpty()) { queue.add(text); } } public static void main(String[] args) { CountDownLatch latch = new CountDownLatch(1); AsyncHandler handler = new AsyncHandler(latch); handler.handle(); // 做一次检查. Scanner scanner = new Scanner(System.in); while (true) { String text = scanner.next(); // 若用户选择退出. if ("exit".equals(text)) { // 表示消息已经发送完成. handler.sendFinish(); break; } handler.sendMsg(text); } try { // 阻塞主线程等待消息写入到本地文件完成. latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } // 释放资源 文件流,队列. handler.release(); // 关闭控制台输入. scanner.close(); } }
Résumé
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!