Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как прервать заблокированный поток? / 11 сообщений из 11, страница 1 из 1
30.05.2005, 09:46
    #33089958
ponomarevvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать заблокированный поток?
Приветствую всех.
Вопрос такой: как прервать выполнение потока без использования метода stop() (который deprecated)?
Ситуация такая: я пытаюсь в отдельном потоке прочитать содержимое каталога на удалённом компе, и мне надо иметь возможность отвалиться по таймауту. Для чтения содержимого используется метод File#listFiles(), и он, сволочь, подвешивает поток. Точнее, время, через которое он возвращается, меня не устраивает…
Можно тут какие-нибудь костыли придумать, или я избрал изначально порочный путь?
Заранее спасибо.
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
31.05.2005, 09:20
    #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
31.05.2005, 13:29
    #33092566
ponomarevvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать заблокированный поток?
Спасибо, буду думать…
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
31.05.2005, 15:40
    #33092926
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать заблокированный поток?
Gurney
Более того, метод stop() не всегда может прервать
поток. Cуществуют вызовы, которые принципиально не прерываются никаким
образом, даже через stop(). В их число входит ввод-вывод. Так что даже
stop может не помочь.


Разве?
Это interrupt() не прерывает поток, если он блокирован вводом-выводом, а stop() с такими по идее должен всегда справляться.
Можно примерчик кода, иллюстрирующий что это не так?
...
Рейтинг: 0 / 0
31.05.2005, 17:25
    #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
01.06.2005, 11:53
    #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
01.06.2005, 12:05
    #33094445
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прервать заблокированный поток?
по getter.kill(); у тебя отвалится TimerThread, а getter продолжит висеть.

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


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