2017-10-01 4 views
0

Je crée un Thread pour cette classe à partir de la fonction principale, mais même après son interruption à l'aide de Thread.currentThread(). La sortie interruption() contient toujours la ligne Still Here.Java Thread actif après l'interruption

public class WriteToServer extends Thread { 

    private DataOutputStream writeMessage; 

    private String clientName; 

    public WriteToServer(Socket socket, String clientName) { 
     try { 
      this.writeMessage = new DataOutputStream(socket.getOutputStream()); 
      this.clientName = clientName; 
     } catch(Exception e) { 
      System.err.println(e); 

      Thread.currentThread().interrupt(); 
     } 
    } 

    public void run() { 
     try { 
      Scanner scanner = new Scanner(System.in); 
      String message = scanner.nextLine(); 

      while (!message.equalsIgnoreCase("quit")) { 
       writeMessage.writeUTF(clientName + ":" + message); 
       message = scanner.nextLine(); 
      } 

      writeMessage.writeUTF(message); 
      writeMessage.close(); 

      Thread.currentThread().interrupt(); 

      System.out.println("Still Here"); 
     } catch(Exception e) { 
      System.err.println(e); 

      Thread.currentThread().interrupt(); 
     } 
    } 
} 

Je suis nouveau à Java et je veux améliorer toutes les suggestions?

+0

Le terme « interruption » est surchargée en Java signifie «pas vraiment une interruption. –

+0

Pouvez-vous élaborer? – sudojdoe

Répondre

2

Il n'y a pas de légal pour arrêter immédiatement l'exécution du thread dans Java. L'appel Thread#interrupt() définit simplement l'indicateur interrupted sur le fil à true. Il est de votre responsabilité en tant que programmeur de vérifier le drapeau interrupted à l'intérieur de votre code et d'éteindre correctement les activités de discussion.

Dans votre exemple, vous pouvez simplement écrire une instruction return qui terminera l'exécution de la méthode run().

Pour plus d'informations contrôle sur quelque chose comme prochain post: https://www.javaworld.com/article/2077138/java-concurrency/introduction-to-java-threads.html

0

Comme suggéré, return va simplement terminer l'exécution de run(). Si vous voulez vérifier d'abord si le fil a été interrompue (par un autre thread), vous pouvez faire:

if (Thread.currentThread().isInterrupted()) { 
    return; 
    }