Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Таймер в потоке  [new]
extra_dj
Member

Откуда:
Сообщений: 31
Приветствую! работаю над задачей мониторинга выполнения запросов, появилась необходимость проверки процесса через определенное время. подскажите, пожалуйста, как правильно реализовать опрос метода?
в моем понимании, необходим еще один поток, который будет проверять, выполняется ли поток. с какой сороны мне подойти? пока остановился на этом:

public class MyTimerTask implements Runnable {

    String name;
    private boolean isActive;

    void disable(){
        isActive=false;
    }

    MyTimerTask(String name){
        isActive = true;
        this.name = name;
        run();
    }

        @Override
        public void run() {
                System.out.println(name + " начал свое выполнение в:" + new Date());
                try {
                    completeTask();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(name + " закончил свое выполнение в:" + new Date());

        }
        private void completeTask() throws InterruptedException {
                 for(int i = 0; i<10;i++){
                     System.out.println(i);
                     Thread.sleep(1000);
                 }
        }


        public static void main(String args[]){
        
            new MyTimerTask("device");
        }
    }
27 апр 20, 18:30    [22123714]     Ответить | Цитировать Сообщить модератору
 Re: Таймер в потоке  [new]
mayton
Member

Откуда: loopback
Сообщений: 46647
необходим еще один поток, который будет проверять, выполняется ли поток

Это сложный и философский вопрос.

Вот если представить что есть процесс ОС Linux и он в течение 5 минут не пишет и не читает диск.
То можно ли считать что он выполняется? Или не выполняется?

Скорее всего без понимания архитектуры того процесса который мы хотим мониторить, ответить на этот
вопрос невозможно.

Что происходить внутри

completeTask();


?

Там есть какой-то сердечный ритм? Heart-beat? Там есть какая-то диаграмма переходов из состояния в состояние?
27 апр 20, 18:46    [22123720]     Ответить | Цитировать Сообщить модератору
 Re: Таймер в потоке  [new]
extra_dj
Member

Откуда:
Сообщений: 31
mayton,
по сути, в completeTask будет ответ от шедулера линукса о том, что процесс завершен. и в этот момент необходимо закрыть поток с таймером. также таймер должен срабатывать раз в n кол-во времени и проверять, пришел ответ (закончился процесс) или нет
27 апр 20, 19:03    [22123722]     Ответить | Цитировать Сообщить модератору
 Re: Таймер в потоке  [new]
mayton
Member

Откуда: loopback
Сообщений: 46647
В коде что ты написал нет по сути никакого мониторинга. Из полезного там - логгирование.

Может быть тебе нужно нечто вроде

wait10secondAndDie()


?
27 апр 20, 19:07    [22123724]     Ответить | Цитировать Сообщить модератору
 Re: Таймер в потоке  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10178
extra_dj
Thread.sleep(1000);
Отстреливать из рогатки. И уже давно.
Персонально для вас в классе Process Java8 появился waitFor с таймаутом.

P.S.
Специально сделал ссылку на доку Java11, поскольку это модуляризированная LTS-версия, а в Java9 появились разные плюшки и усовершенствования типа ProcessHandel.
27 апр 20, 19:21    [22123728]     Ответить | Цитировать Сообщить модератору
 Re: Таймер в потоке  [new]
extra_dj
Member

Откуда:
Сообщений: 31
mayton,
нет. в completeTask будет выполнятся процесс. можно смоделировать, что когда появится 8, надо останавливать поток, писать лог. а до этого проверять все остальные цифры. это если приблизить ситуацию к более реальной
27 апр 20, 19:32    [22123733]     Ответить | Цитировать Сообщить модератору
 Re: Таймер в потоке  [new]
mayton
Member

Откуда: loopback
Сообщений: 46647
extra_dj
mayton,
нет. в completeTask будет выполнятся процесс. можно смоделировать, что когда появится 8, надо останавливать поток, писать лог. а до этого проверять все остальные цифры. это если приблизить ситуацию к более реальной

Ты путаешь понятия процесс и поток. Это напрягает. Если java-thread - то это один подход. Примитивы java.
Если это кастомный процесс операционки который ты запустил из java-runtime - то это скорее всего
будет другой подход и другой смысл. Более того он - не в нашей власти и даже остановить его
с гарантией мы не сможем.
27 апр 20, 19:41    [22123739]     Ответить | Цитировать Сообщить модератору
 Re: Таймер в потоке  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10178
Пардон, попутал процессы и потоки (у кого что болит), но за sleep всё равно надо отстреливать - join(таймаут) к любому потоку из контролируемого набора и проверять по выходу весь набор.
27 апр 20, 19:49    [22123743]     Ответить | Цитировать Сообщить модератору
 Re: Таймер в потоке  [new]
extra_dj
Member

Откуда:
Сообщений: 31
mayton,
ок, тогда еще раз. я запускаю поток, в котором выполняется процесс( действие) - в моем случае это запуск скрипта sql. мне надо чекать, считается он или нет. если скрипт отработал, через линуксовский шедулер приходит ответ, что скрипт завершен (реализация уже есть). вот в это время мне необходимо дергать метод completeTask и проверить - идет расчет или нет и отправлять в лог сообщение типа идет/не идет и время, которое прошло от начала.
в том примере, что я скинул - просто смоделировал такую ситуацию. надо проверить, появилась ли восьмеркаю а до этого отправлять лог, что идет цикл.
возможно я неправильно определил понятие процесс

Сообщение было отредактировано: 27 апр 20, 20:18
27 апр 20, 20:18    [22123757]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить