bonjour,
est-il possible d'arrêter un thread bloqué sur une I/O
merci
Version imprimable
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:
Citation:
Envoyé par InterruptedIOException
Thread.stop() est effectivement déprécié.
Par contre, Thread.interrupt() est justement là pour ça:
Citation:
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é:scarymov:
merci
un bout de code, notamment du moment ou tu lance ton Runnable ?
classe du thread lecteur :
dans mon application :Code:
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:
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.