Maison Java javaDidacticiel Comment la technologie NIO gère-t-elle les opérations d'E/S non bloquantes dans les fonctions Java ?

Comment la technologie NIO gère-t-elle les opérations d'E/S non bloquantes dans les fonctions Java ?

May 01, 2024 am 10:12 AM
nio 并发请求 非阻塞 io

La technologie NIO gère les opérations d'E/S non bloquantes et utilise des mécanismes basés sur les événements pour traiter les E/S de manière asynchrone afin d'améliorer l'efficacité dans les scénarios de requêtes simultanées élevées. Gérez les opérations d'E/S en définissant les canaux, en créant des sélecteurs, en enregistrant les canaux auprès des sélecteurs, en écoutant les événements et en gérant les étapes des événements. Le cas pratique montre un programme Echo non bloquant côté serveur qui utilise NIO pour accepter et répondre de manière asynchrone aux demandes de connexion client.

Java 函数中 NIO 技术如何处理非阻塞 IO 操作?

La technologie NIO dans les fonctions Java gère les opérations d'E/S non bloquantes

NIO (E/S non bloquantes) est un moyen efficace de gérer des requêtes simultanées élevées dans les grandes applications réseau, il utilise le mode non bloquant via des événements. mécanisme pour gérer les E/S de manière asynchrone. L'API NIO est fournie en Java pour décrire les événements, les canaux et les tampons NIO.

1. Définir le canal NIO

Un canal dans NIO représente un fichier ouvert ou une connexion réseau. Il existe quatre principaux types de canaux :

import java.nio.channels.*;

// 文件通道
FileChannel fileChannel = FileChannel.open(Paths.get("file.txt"), StandardOpenOption.READ);

// 套接字通道
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

// 套接字通道
SocketChannel socketChannel = SocketChannel.open();

// 套接字通道
DatagramChannel datagramChannel = DatagramChannel.open();
Copier après la connexion

2. Créer des sélecteurs

Les sélecteurs sont utilisés pour surveiller les événements sur plusieurs canaux. Ils peuvent gérer simultanément un grand nombre de connexions provenant de différents canaux, gérant ainsi efficacement les opérations d’E/S.

import java.nio.channels.Selector;

Selector selector = Selector.open();
Copier après la connexion

3. Enregistrez la chaîne

Enregistrez la chaîne dans le sélecteur pour surveiller les événements qui vous intéressent, tels que les opérations de lecture/écriture.

serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
Copier après la connexion

4. Écoute des événements

Utilisez la méthode select() pour surveiller les événements dans le sélecteur jusqu'à ce qu'un événement se produise. Cette méthode se bloque jusqu'à ce qu'au moins un canal soit prêt à être traité. select() 方法监视 Selector 中的事件,直到有事件发生。该方法会阻塞,直到至少有一个通道准备好处理。

int numKeys = selector.select();
Copier après la connexion

5. 处理事件

通过检查 SelectionKey

for (SelectionKey key : selector.selectedKeys()) {
    if (key.isAcceptable()) {
        // 监听新的连接请求
    } else if (key.isReadable()) {
        // 读取数据
    } else if (key.isWritable()) {
        // 写入数据
    }
}
Copier après la connexion

5. Gestion des événements

Gérez les événements qui se produisent en cochant SelectionKey, qui fournit des détails sur le canal et le type sur lequel l'événement s'est produit.

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;

public class NonBlockingEchoServer {

    public static void main(String[] args) throws IOException {
        // 创建一个 ServerSocketChannel
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(8080));
        serverSocketChannel.configureBlocking(false);

        // 创建一个 Selector
        Selector selector = Selector.open();

        // 注册 ServerSocketChannel 到 Selector,监视 ACCEPT 事件
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            // 监听事件
            selector.select();

            // 获取选择的 SelectionKey 集合
            Set<SelectionKey> selectedKeys = selector.selectedKeys();

            // 遍历选择的 SelectionKey
            Iterator<SelectionKey> iterator = selectedKeys.iterator();
            while (iterator.hasNext()) {
                SelectionKey key = iterator.next();

                if (key.isAcceptable()) {
                    // 新的连接请求
                    SocketChannel socketChannel = serverSocketChannel.accept();
                    socketChannel.configureBlocking(false);
                    socketChannel.register(selector, SelectionKey.OP_READ);
                } else if (key.isReadable()) {
                    // 读取数据
                    SocketChannel socketChannel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(1024);
                    int readBytes = socketChannel.read(buffer);
                    if (readBytes > 0) {
                        // 响应客户端消息
                        buffer.flip();
                        socketChannel.write(buffer);
                    }
                }

                // 从集合中删除处理过的 SelectionKey
                iterator.remove();
            }
        }
    }
}
Copier après la connexion
🎜Cas pratique : programme Echo non bloquant côté serveur🎜🎜🎜Cet exemple crée un serveur qui utilise NIO pour accepter et répondre de manière asynchrone aux connexions client. 🎜rrreee

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quels sont les avantages et les inconvénients de la technologie NIO dans les fonctions Java ? Quels sont les avantages et les inconvénients de la technologie NIO dans les fonctions Java ? May 01, 2024 pm 10:42 PM

La technologie NIO (non-blocking IO) offre les avantages d'une haute performance, d'une évolutivité, d'une faible latence et d'une faible utilisation des ressources dans les fonctions Java, mais elle présente également une complexité plus élevée, la nécessité d'une programmation asynchrone, une difficulté de débogage accrue et des exigences système plus élevées. . En pratique, NIO peut optimiser l'utilisation des ressources et améliorer les performances, par exemple lors du traitement des requêtes HTTP entrantes.

Comment créer une passerelle API évolutive utilisant la technologie NIO dans les fonctions Java ? Comment créer une passerelle API évolutive utilisant la technologie NIO dans les fonctions Java ? May 04, 2024 pm 01:12 PM

Réponse : Grâce à la technologie NIO, vous pouvez créer une passerelle API évolutive dans les fonctions Java pour gérer un grand nombre de requêtes simultanées. Étapes : Créer NIOChannel, enregistrer le gestionnaire d'événements, accepter la connexion, enregistrer les données, lire et écrire le gestionnaire, traiter la demande, envoyer la réponse.

Comment effectuer des tests de concurrence et le débogage dans la programmation simultanée Java ? Comment effectuer des tests de concurrence et le débogage dans la programmation simultanée Java ? May 09, 2024 am 09:33 AM

Tests de concurrence et débogage Les tests de concurrence et le débogage dans la programmation simultanée Java sont cruciaux et les techniques suivantes sont disponibles : Tests de concurrence : tests unitaires : isolez et testez une seule tâche simultanée. Tests d'intégration : tester l'interaction entre plusieurs tâches simultanées. Tests de charge : évaluez les performances et l'évolutivité d'une application sous une charge importante. Débogage simultané : points d'arrêt : suspendez l'exécution du thread et inspectez les variables ou exécutez le code. Journalisation : enregistrez les événements et l'état du fil. Trace de pile : identifiez la source de l’exception. Outils de visualisation : surveillez l'activité des threads et l'utilisation des ressources.

Traitement asynchrone dans la gestion des erreurs de la fonction Golang Traitement asynchrone dans la gestion des erreurs de la fonction Golang May 03, 2024 pm 03:06 PM

Dans les fonctions Go, la gestion asynchrone des erreurs utilise des canaux d'erreur pour transmettre de manière asynchrone les erreurs des goroutines. Les étapes spécifiques sont les suivantes : Créez un canal d'erreur. Démarrez une goroutine pour effectuer des opérations et envoyer des erreurs de manière asynchrone. Utilisez une instruction select pour recevoir les erreurs du canal. Gérez les erreurs de manière asynchrone, telles que l'impression ou la journalisation des messages d'erreur. Cette approche améliore les performances et l'évolutivité du code concurrent car la gestion des erreurs ne bloque pas le thread appelant et l'exécution peut être annulée.

Explication détaillée du framework haute performance PHP Swoole Explication détaillée du framework haute performance PHP Swoole May 04, 2024 am 08:09 AM

Swoole est un framework de concurrence basé sur des coroutines PHP, qui présente les avantages de capacités de traitement simultanées élevées, d'une faible consommation de ressources et d'un développement de code simplifié. Ses principales fonctionnalités incluent : la simultanéité des coroutines, les réseaux pilotés par les événements et les structures de données concurrentes. En utilisant le framework Swoole, les développeurs peuvent améliorer considérablement les performances et le débit des applications Web pour répondre aux besoins des scénarios à forte concurrence.

L'impact de la concurrence excessive de Tomcat L'impact de la concurrence excessive de Tomcat Apr 21, 2024 am 06:49 AM

Une concurrence élevée dans Tomcat entraîne une dégradation des performances et des problèmes de stabilité, notamment un épuisement du pool de threads, des conflits de ressources, des blocages et des fuites de mémoire. Les mesures d'atténuation comprennent : l'ajustement des paramètres du pool de threads, l'optimisation de l'utilisation des ressources, la surveillance des métriques du serveur, la réalisation de tests de charge et l'utilisation d'un équilibreur de charge.

Quelle est exactement la caractéristique non bloquante de ReactPHP? Comment gérer ses opérations d'E / S de blocage? Quelle est exactement la caractéristique non bloquante de ReactPHP? Comment gérer ses opérations d'E / S de blocage? Apr 01, 2025 pm 03:09 PM

Une introduction officielle à la caractéristique non bloquante de l'interprétation approfondie de ReactPHP de la caractéristique non bloquante de ReactphP a suscité de nombreux développeurs: "ReactPhpisnon-blockingByDefault ...

Il n'y a pas de solution après le démarrage et le flash de Tomcat. Il n'y a pas de solution après le démarrage et le flash de Tomcat. Apr 21, 2024 am 07:36 AM

Les raisons pour lesquelles Tomcat s'arrête immédiatement après le démarrage incluent des problèmes de configuration (conflits de ports, autorisations de journal, erreurs de lien Libsocket.so), des ressources insuffisantes (mémoire insuffisante, pool de threads plein) et des problèmes logiciels (incompatibilité de version, fichiers JAR corrompus, logiciels malveillants). . Les étapes de la solution comprennent : 1. Vérifiez la configuration ; 2. Assurez-vous de disposer de ressources suffisantes ; 3. Vérifiez les problèmes logiciels. 4. Autres solutions possibles (afficher les journaux, utiliser la ligne de commande, redémarrer, demander de l'aide).

See all articles