bonjour,
est-il possible d'arrêter un thread bloqué sur une I/O
merci
bonjour,
est-il possible d'arrêter un thread bloqué sur une I/O
merci
Salut,
Je n'ai pas étudié l'API en détail mais il me semble que la plupart des méthodes permettant de d'arrêter un thread sont dépréciées.
Peut-être qu'en précisant un peu plus ton problème on pourra t'aider.
Oui, à partir d'un autre thread et en règle générale le thread qu'on interromp va émettre une IOException, et plus précisément une InterruptedIOException:
Envoyé par InterruptedIOException
Thread.stop() est effectivement déprécié.
Par contre, Thread.interrupt() est justement là pour ça:
If this thread is blocked in an I/O operation upon an interruptible channel then the channel will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException.
apparemment la methode interrupted est définit pour les classes qui etend Thread, mais mon implemente runnable,
donc je vois comment appele la methode interrupted
merci
je m'explique :
pour que la lecture du E/S ne me bloque pas je cree un thread qui attend qui lit quelque chose, s'il ya rien, il est bloqué,
et dans mon application qui à crée ce thread j'attend que le thread me retourne quelque chose sinon au bout d'un moment je passe à autre chose(mon application n'est plus bloquée), mais mon thread reste tjr bloqué sur la lecture, je dois le tué
merci
un bout de code, notamment du moment ou tu lance ton Runnable ?
classe du thread lecteur :
dans mon application :
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 class DataReaderThread extends Observable implements Runnable { public DataReaderThread(CRequestE512 instance) { addObserver(instance); } public void asyncRead() { new Thread(this).start(); } public void run() { int res = -1; try { res = comm.readData(); //lecture du code retour sur port serie } catch (IOException e) { Logger.getLogger(Manager.class).fatal("probleme imprimante"); } if (res != -1) { setChanged(); notifyObservers(new Integer(res)); } } }
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 Integer responce; public void state(){ DataReaderThread dataReaderThread = new DataReaderThread(this); dataReaderThread.asyncRead(); long t; long td; td = System.currentTimeMillis(); do { t = System.currentTimeMillis(); } while (((t - td) < 10L) && responce == null); if(responce != null) {} //le thread à lut sur le buffer else //le thread soit il est resté bloqué ou il a levé une exception //là je tue le thread si il est bloqué } @Override public void update(Observable o, Object val) { responce = (Integer) val; }
- Ton dataReaderThread, c'est pas une classe qui dérive de Thread ?
- C'est toi qui l'a codée / Tu peux taper dans son code source ?
- Elle propose quoi comme interface publique et protégée ?
EDIT: ne laisser que 10ms à ton thread pour lire des données me semble insuffisant quand on sait que les ordonnanceurs de certains OS ne descendent pas en dessous d'une résolution de 15 à 20ms pour switcher entre plusieurs threads.
De plus, tu fais là une attente active : un simple sleep en lieu et place de ton while serait bien plus pertinent et laisserait par là même l'occasion aux autres threads (y compris ton DataReader) de s'exécuter.
Partager