2009-06-24 6 views
3

Je suis en train d'apprendre Java, je lisais un tutoriel qui a dit quelque chose comme ceci:Java ne fait-il pas les choses de manière asynchrone?

while (N <= 0) { 
      TextIO.put("The starting point must be positive. Please try again: "); 
      N = TextIO.getlnInt(); 
     } 

Il semble que lorsque vous demandez à l'utilisateur pour l'entrée suspend jusqu'à ce que la réponse est reçu? Je suis habitué à ces choses qui se passent de manière asynchrone. Est-ce normal pour Java? ou pouvez-vous faire les deux?

Merci.

Répondre

5

Je ne suis pas familier avec cette bibliothèque TextIO, mais lorsque j'appelle InputStream.read(), c'est-à-dire lorsque j'utilise System.in.read(), elle se bloque jusqu'à ce que les données d'entrée soient disponibles. Cela le rend synchrone.

Vous pouvez éviter cela (c'est-à-dire le rendre asynchrone) en utilisant un autre thread pour capturer l'entrée.

2

Pour que cela fonctionne comme vous le souhaitez (je suppose que vous avez d'autres parties de l'application que vous souhaitez continuer à utiliser, par exemple une interface graphique), vous devrez effectuer plusieurs opérations. L'implémentation de TextIO serait vraiment le facteur décisif, mais dans l'exemple de code spécifique ci-dessus, la boucle while dépend de cette entrée, donc elle va devoir s'arrêter à ce point quel que soit le multithreading.

3

Pour les E/S asynchrones, il existe java.nio. Mais oui, les E/S synchrones sont typiques de Java.

0

Ouais, c'est à peu près comment ça se passe. Si vous voulez le faire de manière asynchrone, vous pouvez créer le get dans un thread séparé.

1

Vous pouvez faire les deux?

Vous pouvez faire les deux.

Normalement, cette classe devrait utiliser une sorte de lecture d'entrée standard qui, par défaut, bloque, mais il est tout à fait possible d'avoir une lecture non bloquante des flux.

Si vous publiez le code actuel, nous pourrions vous fournir une explication plus détaillée.

3

Votre envoi/réception de classe peut avoir la forme suivante (ancienne manière):

class Sender { 

    Integer N = null; 
    boolean running; 

    public void request(byte [] re) { 
     new Thread() { 
      public void run() { 
       if(!running) 
        running = true; 
       else 
        synchronized(Sender.this) {try {Sender.this.wait(); }catch(Exception e){}} 
       TextIO.put("The starting point must be positive. Please try again: "); 
       N = TextIO.getlnInt(); 
       running = false; 
       synchronized(Sender.this) {try {Sender.this.notify(); }catch(Exception e){}} 
      } 
     }.start(); 
    } 

    public boolean hasResponse() { 
     return N != null; 
    } 

    public int getResponse() { 
     return N.intValue(); 
    } 

} 

Je recommande pleinement ce livre: Java NIO de O'Reilly. C'est un livre complet pour les IO synchrones et asynchrones.

+0

Merci, j'aime les livres orielly donc je pense que je vais vérifier cela, j'ai aussi entendu java efficace était vraiment bon. –

Questions connexes