Jak odblokować wątek?

0

Witam,

Mam do czynienia z następującą trudnością. W jednym wątku dzieje się jakaś cykliczna czynność, polegająca na uruchamianiu jakiejś funkcji zwracającej odpowiedź. Czasami zdarzy się tak, że odpowiedź nie nadejdzie po określonym timeoucie i tamten wątek jest wciąż zablokowany (czeka na odpowiedź do końca świata). Teraz robię to tak, że po prostu pozbywam się referencji do tamtego wątku i ustawiam mu flagę na STOP i tworzę sobie kolejny, który będzie działał dalej. Tamten mam nadzieję, że zniszczy maszyna wirtualna. Ale czy jest jakiś sposób, żeby taki zablokowany wątek odblokować? notify?

0

Nie da się odblokować wątku który odczytuje dane synchronicznie. Niby jak miało by się to dziać?

Może jest jakieś asynchroniczne API do użycia? Albo funkcja typu ready() mówiąca czy najbliższy odczyt będzie blokował wątek.

0

Da sie, ale zamykajac kanal, ktory ma dostarczyc dane - powiedzmy inputStream.close(); - w wiekszosci przypadkow rzuci to IOExcepion, ktory moze byc wychwycony w watku i w tedy watek moze sie "normalnie" zakonczyc.

Edit: Oczywiscie trzeba sie zastanowic nad konsekwencjami - nawiazywanie nowego polaczenia, etc. Byc moze jest to rozwiazanie niemozliwe do zastosowania u Ciebie.

0

A ja bym zamiast zwykłych obiektów Thread wykorzystał ze szkieletu Executor i Future. Tam jest możliwość tworzenia wątku z zadanym "czasem życia".

http://stackoverflow.com/questions/1164301/how-do-i-call-some-blocking-method-with-a-timeout-in-java

0

Mimo wszystko zablokowany wątek jest ubijany (o ile dobrze myślę), a nie zwalniany dla następnego taska więc wydajnościowo zysk żaden z Executora. Mam rację?

0

@donkey, tru, ale zysk leży gdzie indziej. Jeżeli jakiś wątek się "zaciął" to jego ubicie i wznowienie za pomocą Executora jest łatwiejsze i bardziej eleganckie niż ręczne kombinowanie.

0

Gorzej gdy trzeba mieć dostęp do wątku odpalonego poprzez Executora. Taki np ScheduledCośTamExecutor opakowuje wątki we własne taski, w których nie ma metody typu getRunnable() i trzeba ją własnoręcznie dorobić poprzez:

  • napisanie własngo Taska (implementacji RunnableScheduledFuture) delegującej opakowującego Taska od Executora,
  • napisanie własnej podklasy Executora, która napisuje metody decorateTask,

Mimo wszystko korzystanie z STPE jest na dłuższą metę lepszym rozwiązaniem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1