Maison > Java > javaDidacticiel > le corps du texte

Analyse détaillée de la mise en œuvre par Java du mécanisme de traitement asynchrone

黄舟
Libérer: 2017-09-14 10:59:03
original
1411 Les gens l'ont consulté

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 queue; private BufferedWriter bw; public AsyncHandler(CountDownLatch latch) { this.latch = latch; /** * 使用链表实现. */ queue = new LinkedBlockingQueue(); File file = new File("E:/hello.txt"); try { bw = new BufferedWriter(new FileWriter(file)); } catch (IOException e) { throw new RuntimeException(e); } } public void handle() { // 模拟性能瓶颈的执行过程,3s处理一条消息. new Thread() { public void run() { while (!handleFinish) { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e1) { // 不做处理. } String s = queue.peek(); if (s != null) { queue.poll(); try { bw.write(s); bw.newLine(); } catch (IOException e) { } } // 若队列为空并且消息发送完成. if (queue.isEmpty() && sendFinish) { // 计数器1->0 latch.countDown(); // 让处理过程结束. handleFinish = true; break; } } } }.start(); } /** * *
  * 给出消息发送完成的标识.
  * 
* */ 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(); } }
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!