Maison Java javaDidacticiel Comment interrompre un thread en cours d'exécution en Java (3)

Comment interrompre un thread en cours d'exécution en Java (3)

Dec 30, 2016 pm 01:22 PM
java

Interrompre l'opération d'E/S

Cependant, que se passe-t-il si le thread est bloqué pendant que l'opération d'E/S est en cours ? Les opérations d'E/S peuvent bloquer les threads pendant des périodes considérables, en particulier lorsque des applications réseau sont impliquées. Par exemple, un serveur peut devoir attendre une requête, ou une application réseau peut devoir attendre une réponse d'un hôte distant.

Si vous utilisez des canaux (il s'agit de la nouvelle API d'E/S introduite dans Java 1.4), alors le thread bloqué recevra une exception ClosedByInterruptException. Si tel est le cas, la logique du code est la même que dans le troisième exemple, seule l'exception est différente.

Cependant, vous utilisez peut-être des E/S traditionnelles qui existaient avant Java 1.0 et nécessitent plus de travail. Dans ce cas, Thread.interrupt() ne fonctionnera pas car le thread ne quittera pas l'état bloqué. Le listing D décrit ce comportement. Bien que l'interruption() soit appelée, le thread ne quittera pas l'état bloqué.

Listing D
import java.io.*;
class Example4 extends Thread {
  public static void main( String args[] ) throws Exception {
    Example4 thread = new Example4();
   System.out.println( "Starting thread..." );
   thread.start();
   Thread.sleep( 3000 );
   System.out.println( "Interrupting thread..." );
   thread.interrupt();
   Thread.sleep( 3000 );
   System.out.println( "Stopping application..." );
   //System.exit( 0 );
  }
  public void run() {
   ServerSocket socket;
    try {
      socket = new ServerSocket(7856);
    } catch ( IOException e ) {
     System.out.println( "Could not create the socket..." );
      return;
    }
    while ( true ) {
     System.out.println( "Waiting for connection..." );
      try {
       Socket sock = socket.accept();
      } catch ( IOException e ) {
      System.out.println( "accept() failed or interrupted..." );
      }
    }
  }
}
Copier après la connexion

Heureusement, la plateforme Java propose une solution à cette situation, qui consiste à appeler la méthode close() du socket qui bloque le thread. Dans ce cas, si le thread est bloqué par une opération d'E/S, le thread recevra une SocketException, ce qui est très similaire à l'utilisation de la méthode interrompue() pour provoquer la levée d'une InterruptedException.

La seule chose à noter est qu'une référence au socket doit exister, et ce n'est qu'ainsi que la méthode close() peut être appelée. Cela signifie que l'objet socket doit être partagé. Le listing E décrit cette situation. La logique d'exécution est la même que celle de l'exemple précédent.

Listing E
import java.net.*;
import java.io.*;
class Example5 extends Thread {
  volatile boolean stop = false;
  volatile ServerSocket socket;
  public static void main( String args[] ) throws Exception {
    Example5 thread = new Example5();
   System.out.println( "Starting thread..." );
   thread.start();
   Thread.sleep( 3000 );
   System.out.println( "Asking thread to stop..." );
   thread.stop = true;
   thread.socket.close();
   Thread.sleep( 3000 );
   System.out.println( "Stopping application..." );
   //System.exit( 0 );
  }
  public void run() {
    try {
      socket = new ServerSocket(7856);
    } catch ( IOException e ) {
     System.out.println( "Could not create the socket..." );
      return;
    }
    while ( !stop ) {
     System.out.println( "Waiting for connection..." );
      try {
       Socket sock = socket.accept();
      } catch ( IOException e ) {
      System.out.println( "accept() failed or interrupted..." );
      }
    }
   System.out.println( "Thread exiting under request..." );
  }
}
Copier après la connexion

Voici le résultat après avoir exécuté le code dans le listing E :

Starting thread...
Waiting for connection...
Asking thread to stop...
accept() failed or interrupted...
Thread exiting under request...
Stopping application...
Copier après la connexion

Le multithreading est un outil puissant, mais il présente une série de difficultés. L'un d'eux est de savoir comment interrompre un thread en cours d'exécution. Si elle est correctement implémentée, l'interruption des threads à l'aide des techniques ci-dessus est plus simple que l'utilisation des opérations en ligne déjà fournies sur la plate-forme Java.

Ce qui précède explique comment interrompre un thread en cours d'exécution (3) en Java. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.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

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

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

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)

Racine carrée en Java Racine carrée en Java Aug 30, 2024 pm 04:26 PM

Racine carrée en Java

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Nombre parfait en Java

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Générateur de nombres aléatoires en Java

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Weka en Java

Numéro Armstrong en Java Numéro Armstrong en Java Aug 30, 2024 pm 04:26 PM

Numéro Armstrong en Java

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Numéro de Smith en Java

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Questions d'entretien chez Java Spring

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Break or Return of Java 8 Stream Forach?

See all articles