powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как прервать заблокированный поток?
11 сообщений из 11, страница 1 из 1
Как прервать заблокированный поток?
    #33089958
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую всех.
Вопрос такой: как прервать выполнение потока без использования метода stop() (который deprecated)?
Ситуация такая: я пытаюсь в отдельном потоке прочитать содержимое каталога на удалённом компе, и мне надо иметь возможность отвалиться по таймауту. Для чтения содержимого используется метод File#listFiles(), и он, сволочь, подвешивает поток. Точнее, время, через которое он возвращается, меня не устраивает…
Можно тут какие-нибудь костыли придумать, или я избрал изначально порочный путь?
Заранее спасибо.
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
Как прервать заблокированный поток?
    #33091751
Gurney
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ponomarevvb wrote:
> Приветствую всех.
> Вопрос такой: как прервать выполнение потока без использования метода stop()
> (который deprecated)?
> Ситуация такая: я пытаюсь в отдельном потоке прочитать содержимое каталога на
> удалённом компе, и мне надо иметь возможность отвалиться по таймауту. Для чтения
> содержимого используется метод File#listFiles(), и он, сволочь, подвешивает
> поток. Точнее, время, через которое он возвращается, меня не устраивает:
> Можно тут какие-нибудь костыли придумать, или я избрал изначально порочный путь?
> Заранее спасибо.
Метод stop() стал Deprecated потому что он опасен. С твоем случае
другого варианта нет. Более того, метод stop() не всегда может прервать
поток. Cуществуют вызовы, которые принципиально не прерываются никаким
образом, даже через stop(). В их число входит ввод-вывод. Так что даже
stop может не помочь.
Единственное, что можно посоветовать, это разбить работу по поиску
файлов на куски, используя FileFilter. Или использова jCIFS, возможно
там это более быстро сделано.
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Как прервать заблокированный поток?
    #33092566
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, буду думать…
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
Как прервать заблокированный поток?
    #33092926
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gurney
Более того, метод stop() не всегда может прервать
поток. Cуществуют вызовы, которые принципиально не прерываются никаким
образом, даже через stop(). В их число входит ввод-вывод. Так что даже
stop может не помочь.


Разве?
Это interrupt() не прерывает поток, если он блокирован вводом-выводом, а stop() с такими по идее должен всегда справляться.
Можно примерчик кода, иллюстрирующий что это не так?
...
Рейтинг: 0 / 0
Как прервать заблокированный поток?
    #33093253
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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--
...
Рейтинг: 0 / 0
Как прервать заблокированный поток?
    #33094403
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что думает многоуважаемый 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.
/* Поток, который может быть заблокирован. */
 private   class  GetterThread  extends  Thread
{
	 private   static   final   long  LOAD_TIMEOUT =  3000 ;

	 private  File[] files =  null ;
			
	 private   long  birth = System.currentTimeMillis();
			
	 private   boolean  loaded = false;
			
	 public   void  run()
	{
		files = // Вот тут получаем список файлов, возможно, очень долго.
		loaded = true;
	}
			
	 public  File[] getFiles()
	{
		 if  (loaded)
			 return  files;
		 return   null ;
	}
		
	 public   boolean  isLoaded()
	{
		 return  loaded;
	}

	 public   boolean  isExpired()
	{
		 return  birth + LOAD_TIMEOUT <= System.currentTimeMillis();
	}
			
	 public   void  kill()
	{
		 throw   new  ThreadDeath();
	}
}

/* Поток-наблюдатель. */
 private   class  TimerThread  extends  Thread
{
	 private  GetterThread getter;
			
	 public  TimerThread(GetterThread getter)
	{
		 super ();
		 this .getter = getter;
	}

	 public   void  run()
	{
		 while  (!getter.isExpired() && !getter.isLoaded())
		{
			yield();
		}
		 if  (!getter.isLoaded())
			getter.kill();
	}
			
	 public   synchronized   void  start()
	{
		getter.start();
		 super .start();
	}
}

…

/* Где-то в коде: */
	GetterThread getter =  new  GetterThread();
	TimerThread timer =  new  TimerThread(getter);
		
	timer.start();
	 try 
	{
		timer.join();
	}
	 catch  (InterruptedException ignored)
	{
	}
			
	File[] children = getter.getFiles();
…

Так нормально или я неправильно понял про ThreadDeath, или ещё что-то не так сделал?
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
Как прервать заблокированный поток?
    #33094445
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по getter.kill(); у тебя отвалится TimerThread, а getter продолжит висеть.

если именно это и задумывалось, то ок, но не проще ли в этом случае просто вызвать return в методе TimerThread.run()? :)
...
Рейтинг: 0 / 0
Как прервать заблокированный поток?
    #33094705
Gurney
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Как прервать заблокированный поток?
    #33094921
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про закрытие источника данных тоже читал в Java Threads (2 ed.) Значит, никак, в общем случае… Что ж, спасибо всем.
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
Как прервать заблокированный поток?
    #33097684
black zorro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что если попробовать в воспользоватсья методом
Код: plaintext
1.
2.
3.
4.
5.
theFile.listFiles (ТутКлассФильтра ()
 boolean  accept(чего то там){
  if  (terminated)
   stop или interrupt или  throw   new  ThreadDeath
}
)
...
Рейтинг: 0 / 0
Как прервать заблокированный поток?
    #33098296
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Black Zorro, идея понравилась, буду пробовать
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как прервать заблокированный поток?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]