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..." ); } } } }
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..." ); } }
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...
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) !