|
|
|
Как прервать заблокированный поток?
|
|||
|---|---|---|---|
|
#18+
Приветствую всех. Вопрос такой: как прервать выполнение потока без использования метода stop() (который deprecated)? Ситуация такая: я пытаюсь в отдельном потоке прочитать содержимое каталога на удалённом компе, и мне надо иметь возможность отвалиться по таймауту. Для чтения содержимого используется метод File#listFiles(), и он, сволочь, подвешивает поток. Точнее, время, через которое он возвращается, меня не устраивает… Можно тут какие-нибудь костыли придумать, или я избрал изначально порочный путь? Заранее спасибо. --С уважением, ponomarevvb-- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 09:46 |
|
||
|
Как прервать заблокированный поток?
|
|||
|---|---|---|---|
|
#18+
ponomarevvb wrote: > Приветствую всех. > Вопрос такой: как прервать выполнение потока без использования метода stop() > (который deprecated)? > Ситуация такая: я пытаюсь в отдельном потоке прочитать содержимое каталога на > удалённом компе, и мне надо иметь возможность отвалиться по таймауту. Для чтения > содержимого используется метод File#listFiles(), и он, сволочь, подвешивает > поток. Точнее, время, через которое он возвращается, меня не устраивает: > Можно тут какие-нибудь костыли придумать, или я избрал изначально порочный путь? > Заранее спасибо. Метод stop() стал Deprecated потому что он опасен. С твоем случае другого варианта нет. Более того, метод stop() не всегда может прервать поток. Cуществуют вызовы, которые принципиально не прерываются никаким образом, даже через stop(). В их число входит ввод-вывод. Так что даже stop может не помочь. Единственное, что можно посоветовать, это разбить работу по поиску файлов на куски, используя FileFilter. Или использова jCIFS, возможно там это более быстро сделано. Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2005, 09:20 |
|
||
|
Как прервать заблокированный поток?
|
|||
|---|---|---|---|
|
#18+
Спасибо, буду думать… --С уважением, ponomarevvb-- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2005, 13:29 |
|
||
|
Как прервать заблокированный поток?
|
|||
|---|---|---|---|
|
#18+
Gurney Более того, метод stop() не всегда может прервать поток. Cуществуют вызовы, которые принципиально не прерываются никаким образом, даже через stop(). В их число входит ввод-вывод. Так что даже stop может не помочь. Разве? Это interrupt() не прерывает поток, если он блокирован вводом-выводом, а stop() с такими по идее должен всегда справляться. Можно примерчик кода, иллюстрирующий что это не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2005, 15:40 |
|
||
|
Как прервать заблокированный поток?
|
|||
|---|---|---|---|
|
#18+
stop() The thread represented by this thread is forced to stop whatever it is doing abnormally and to throw a newly created ThreadDeath object as an exception. Т.е судя по всему stop() прерывает выполнение потока, что бы он ни делал… Я так понял, это единственный способ прервать поток в моей ситуации? И этот способ, несмотря на единственность, deprecated? --С уважением, ponomarevvb-- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2005, 17:25 |
|
||
|
Как прервать заблокированный поток?
|
|||
|---|---|---|---|
|
#18+
А что думает многоуважаемый All по поводу использования в такой ситуации искслючения ThreadDeath? Я так понял, что если вызывать его в методе потока, то он будет прерван. Поэтому назрела мысль сделать так: Код: plaintext 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. Так нормально или я неправильно понял про ThreadDeath, или ещё что-то не так сделал? --С уважением, ponomarevvb-- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 11:53 |
|
||
|
Как прервать заблокированный поток?
|
|||
|---|---|---|---|
|
#18+
по getter.kill(); у тебя отвалится TimerThread, а getter продолжит висеть. если именно это и задумывалось, то ок, но не проще ли в этом случае просто вызвать return в методе TimerThread.run()? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 12:05 |
|
||
|
Как прервать заблокированный поток?
|
|||
|---|---|---|---|
|
#18+
Sun JDK docs What if a thread doesn't respond to Thread.interrupt? In some cases, you can use application specific tricks. For example, if a thread is waiting on a known socket, you can close the socket to cause the thread to return immediately. Unfortunately, there really isn't any technique that works in general. It should be noted that in all situations where a waiting thread doesn't respond to Thread.interrupt, it wouldn't respond to Thread.stop either. Such cases include deliberate denial-of-service attacks, and I/O operations for which thread.stop and thread.interrupt do not work properly. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 13:09 |
|
||
|
Как прервать заблокированный поток?
|
|||
|---|---|---|---|
|
#18+
Про закрытие источника данных тоже читал в Java Threads (2 ed.) Значит, никак, в общем случае… Что ж, спасибо всем. --С уважением, ponomarevvb-- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 14:03 |
|
||
|
Как прервать заблокированный поток?
|
|||
|---|---|---|---|
|
#18+
а что если попробовать в воспользоватсья методом Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2005, 15:41 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33093253&tid=2152269]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
53ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 324ms |

| 0 / 0 |
