IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

Opération read bloque le thread


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut Opération read bloque le thread
    Bonjour,

    J'ai un programme qui a pour fonctionnalité de télécharger un fichier depuis un serveur. Le fichier est plus ou moins gros et le débit est plus ou bon (cela peut aller de quelques octets par secondes à quelques Mo par secondes.
    J'ai commencé par développer un classe qui lance un Thread. Ce Thread contient toute la routine pour télécharger le fichier. Cela fonctionne très bien. Je souhaite ajouter une fonctionnalité. Cette fonctionnalité consiste à pouvoir arrêter à tout moment le téléchargement. Pour cela j'ai mis en place dans mon Thread un booléen qui est passé à true dès que je veux annuler le téléchargement. Dans ma boucle si le booléen est à true, je quitte la boucle.

    Voici un exemple allégé du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    import java.io.InputStream;
    import java.net.InetAddress;
    import java.net.InetSocketAddress;
    import java.net.Socket;
    import java.net.SocketAddress;
     
    public class Download implements Runnable {
     
    private boolean killMe = false;
     
    @Override
    public void run() {
    	String host = "http://www.domaine.com/fichier.txt";
    	InetAddress addr = InetAddress.getByName(host);
    	int port = 80;
    	SocketAddress sockaddr = new InetSocketAddress(addr, port);
    	Socket sock = new Socket();
    	int timeoutMs = 5000; // 5s
    	sock.connect(sockaddr, timeoutMs);
     
    	private byte[] buffer = new byte[32 * 1024];
    	InputStream input = sock.getInputStream();
    	do {
    		bufferRead = input.read(buffer);
    	} while ((bufferRead != -1) && !killMe);
    }
     
    public void killMe() {
    	killMe = true;
    }
    }
    Ceci est le contenu simplifié de ma classe permettant de télécharger le fichier. Dans cette version, le fichier n'est pas enregistré sur le disque.

    Tout se passe bien dans la majorité des cas, j'appelle la fonction killMe et le téléchargement se stoppe plus ou moins rapidement. Et c'est là où est mon problème... plus le débit est lent ou instable, plus il va être long à s’arrêter. J'ai remarqué que le programme bloqué plus facilement pendant quelques secondes voir minutes(!) sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bufferRead = input.read(buffer);
    Cela empêche l'utilisateur de quitter le téléchargement du fichier... comment je peux améliorer cette partie ? J'ai testé le package NIO mais ça me fait exactement pareil, j'ai mal fait ?

    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    J'aurais tenter éventuellement un interrupt sur le thread en espérant que read soit "interruptable" mais maintenant j'ai des doutes...
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut
    Déjà tenté mais c'est pire, il attends la fin de la méthode run pour s’arrêter

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2011
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 5
    Par défaut
    Bonjour,

    Les opérations de la classe SocketChannel peuvent être interrompues via un "interrupt".

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par wax78 Voir le message
    J'aurais tenter éventuellement un interrupt sur le thread en espérant que read soit "interruptable" mais maintenant j'ai des doutes...
    L'intérêt de interrupt(), c'est que read(), entre autres, est interruptible.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Citation Envoyé par thelvin Voir le message
    L'intérêt de interrupt(), c'est que read(), entre autres, est interruptible.
    Il me semblait aussi mais je n'était plus sure en fait
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut
    Merci, je vais essayer. J'ai trouvé également un post intéressant sur un blog concernant l'arrêt propre d'un Thread en java : http://www.roseindia.net/javatutoria..._cleanly.shtml. Si cela intéresse quelqu'un

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par FinalSpirit Voir le message
    Merci, je vais essayer. J'ai trouvé également un post intéressant sur un blog concernant l'arrêt propre d'un Thread en java : http://www.roseindia.net/javatutoria..._cleanly.shtml. Si cela intéresse quelqu'un
    C'est une bonne explication, en effet.
    Et d'ailleurs cela m'apprend que si on construit des sockets directement avec le constructeur Socket, plutôt qu'à base de SocketChannel, elles ne sont en fait pas interruptibles. Apparemment ça n'a pas été rétrofitté pour utiliser nio par défaut. Oups, moi m'est trompé.
    Je n'avais jamais remarqué.

    Merci aussi à Alain qui l'a pointé du doigt au-dessus.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Bluetooth - InputStream.read() bloque indéfiniment
    Par Kiristu dans le forum Java ME
    Réponses: 3
    Dernier message: 29/01/2008, 10h14
  2. Réponses: 3
    Dernier message: 07/03/2007, 10h48
  3. [API Win32 sans MFC] Lecture port série: thread bloqué
    Par dacid dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 24/05/2006, 13h34
  4. Opération mathématique entre deux Threads
    Par rvzip64 dans le forum Langage
    Réponses: 11
    Dernier message: 13/06/2005, 11h58
  5. [Threads et interface] le thread bloque tout
    Par meda dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 28/10/2004, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo