Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Задание ограничения по времени на выполнение функции / 6 сообщений из 6, страница 1 из 1
01.12.2004, 22:20
    #32808519
mitya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задание ограничения по времени на выполнение функции
Есть код:
private String[] doCurrentTask(Task at) throws Exception
{
try
{
String[] result = null;
result = at.perform();
}
catch(Exception e)
{
log("error in doing current task " + e.getMessage());
throw e;
}
return result;
}

Функция at.perform() может выполняться очень долго или код в ней может зациклиться.
Необходимо, чтобы была возможность сделать ограничение на выполнение
at.perform(), скажем N секунд и если не выполнилась, то result = null.
Класс Task - интерфейс и его реализации я менять не могу.

Возможно ли такое сделать в Java?
...
Рейтинг: 0 / 0
01.12.2004, 23:38
    #32808551
ponomarevvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задание ограничения по времени на выполнение функции
Можно попробовать так:
Код: 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.
 import  java.util.TimerTask;
 import  java.util.Timer;
...

 private   static   final   int  WAIT_TIME =  5000 ; // Ждём 5 секунд.

...
 boolean  interrupted = false;
Thread mainTask =  new  Thread
{
     public   void  run()
    {
        result = at.perform();
    }
}
mainTask.start(); // Пошли выполнять трудоёмкую процедуру в отдельном потоке.
 new  Timer(true).schedule(
     new  TimerTask()
    {
         public   void  run()
        {
            interrupted = true;
            mainTask.interrupt();
        }
    },
    WAIT_TIME
);
 if  (interrupted)
    result =  null ;
Т. е. по таймеру прерывается поток, выполняющий затратную функцию. Правда, надо что-то изобретать будет, если at.perform() в процессе работы занимает ресурсы - например, открывает соединения с базой или файлы.
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
02.12.2004, 02:14
    #32808601
hgst
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задание ограничения по времени на выполнение функции
По поводу Task.interrupt() - зависит во многом от класса Task, точнее от его функции perform.
1. Если он сам порождает потоки, то они не будут убиты.
2. Сам поток получит InterruptedException при вызове interrupt только если он стоит в режиме ожидания по wait, sleep, join. В противном случае он прерван не будет, поменяется статус, но объекту Task это все равно.

Но если убивать поток не требуется, а просто свалится по timeout - никаких проблем.
Просто mainTask.join(WAIT_TIME) - и по окончанию проверить есть данные обработки или нет. Timer здесь не нужет - он выполняется асинхронно. После
schedule сразу же перейдешь на if (interrupted) {...} - в любом случае нужно ожидание
...
Рейтинг: 0 / 0
02.12.2004, 11:35
    #32809129
mitya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задание ограничения по времени на выполнение функции
По поводу:
1)
Thread mainTask = new Thread
{
public void run()
{
result = at.perform();
}
}

at - я могу обьявить final, а как же по поводу result?
2)
По поводу Task.interrupt() - зависит во многом от класса Task, точнее от его функции perform.
1. Если он сам порождает потоки, то они не будут убиты.
2. Сам поток получит InterruptedException при вызове interrupt только если он стоит в режиме ожидания по wait, sleep, join. В противном случае он прерван не будет, поменяется статус, но объекту Task это все равно.

Но если убивать поток не требуется, а просто свалится по timeout - никаких проблем.
Просто mainTask.join(WAIT_TIME) - и по окончанию проверить есть данные обработки или нет. Timer здесь не нужет - он выполняется асинхронно. После
schedule сразу же перейдешь на if (interrupted) {...} - в любом случае нужно ожидание

Если Task сам порождает потоки, то возможно ли как-то и их убить?

Что значит:
2. Сам поток получит InterruptedException при вызове interrupt только если он стоит в режиме ожидания по wait, sleep, join. В противном случае он прерван не будет, поменяется статус, но объекту Task это все равно.
Что разве interrupt может и не прервать поток? Может destroy поможет?
...
Рейтинг: 0 / 0
02.12.2004, 11:53
    #32809191
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задание ограничения по времени на выполнение функции
откуда взято - не помню, некий класс работы с модемом

здесь - метод sendATCommand(f_cmd, f_rsp) может выполняться долго

Код: 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.
   private   boolean  sendATCommand(String command, String response,  int  timeOut) {
    // the other sendATCommand may never return.  This implementation
    // provides a timeOut parameter to cancel the call.
     final  String f_cmd = command;
     final  String f_rsp = response;

    Thread T =  null ;

     try  {
      Runnable r =  new  Runnable() {
         public   void  run() {
           try  {
            sendATCommand(f_cmd, f_rsp);
          }  catch  (Exception e) {
            serial.debugString( 1 , "sendATCommand: " + e.toString());
          }
        };
      };
      T =  new  Thread(r);
      T.start();
    }  catch  (Exception e) {
      serial.debugString( 1 , "sendATCommand: " + e.toString());
    }

     while  (timeOut >  0 ) {
       try  {
        Thread.currentThread().sleep( 20 );
        timeOut -=  20 ;
      }  catch  (java.lang.InterruptedException ie) {

      }

       if  (!T.isAlive()) {
         break ;
      }
    }

     if  (timeOut >  0 ) {
       if  (sendATError == false)
         return  true;
       else 
         return  false;
    }  else  {
      T.interrupt();
      serial.debugString( 4 , "Result at timeout -> " + result);
       return  false;
    }
  }

--
FUCK THE iNET!!!
...
Рейтинг: 0 / 0
02.12.2004, 15:30
    #32809922
hgst
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задание ограничения по времени на выполнение функции
2 Mitya, А.Грасоff™

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html#interrupt()

Здесь подробнее. Прерван поток будет только если он в состроянии блокировки, ожидания при IO. В остальных случаях - нет.
Т.е. к примеру пустой цикл while (true) {} прерван не будет.

Последний пример - это ввод/вывод
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Задание ограничения по времени на выполнение функции / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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