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.
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; }
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
Partager