Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ожидание завершения потока 
V
    Опции темы
gpepsi
Дата 14.8.2012, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



У меня есть поток, который должен работать как таймер.
Он должен спать и просыпаться через определенное время.
Не использовал таймер, т.к. операции потока могут быть очень длительными.

Так вот если поток ждет своего времени слишком долго, то его тогда сложно будет остановить (долго ждать).
Появилась идея, что поток должен ждать на неком объекте синхронизации.

Код

class SomeThread extends Thread
{
    private final CountDownLatch  m_object = new CountDownLatch(1);

    @Override
    public void run()
    {
         // Если не дождались завершения
         while (!m_object.await(10 * 60, TimeUnit.SECONDS))
         {
             // Делаем свою грязную работу
         }
    }

    final void stopThread()
   {
        m_object.countDown();
        this.stop();
        this.join ();
   }
}


Тогда поток ждет 10 минут. Если не дождался завершения, то выполняет работу.
А если дождался, то поток завершается.
Но метод Thread.stop объявлен как final и не является абстрактным, для того, чтобы его можно было перегрузить.

Правильно ли я мыслю, или можно сделать как по-другому с перегрузкой абстрактных методов ?

Это сообщение отредактировал(а) gpepsi - 14.8.2012, 11:13
PM MAIL   Вверх
Ares4322
Дата 14.8.2012, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 1
Всего: 3



Есть такая штука - http://docs.oracle.com/javase/7/docs/api/j...torService.html
Он создается так - http://docs.oracle.com/javase/7/docs/api/j...ThreadPool(int)
В ScheduledExecutorService можно задать с какой задержкой или с каким периодом будет запускаться поток.
Или это не то?
PM MAIL   Вверх
jk1
Дата 14.8.2012, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

Не использовал таймер, т.к. операции потока могут быть очень длительными.


А зря, можно очень просто адаптировать таймер к операциям любой длительности:

Код

final Executor executor = Executors.newCachedThreadPool();
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                executor.execute(new Runnable() {
                    @Override
                    public void run() {
                        //long task
                    }
                });
            }
        }, 1000);


код конечно надо причесать, но общая идея должна быть ясна

Добавлено через 3 минуты и 39 секунд
Цитата

Есть такая штука - http://docs.oracle.com/javase/7/docs/api/j...torService.html
Он создается так - http://docs.oracle.com/javase/7/docs/api/j...ThreadPool(int)
В ScheduledExecutorService можно задать с какой задержкой или с каким периодом будет запускаться поток.
Или это не то? 


Зависит от требований.
Если нужно, чтобы между концом предыдущего выполнения и началом следующего был фиксированный интервал времени, то да, ScheduledExecutorService#scheduleWithFixedDelay подходит.
Если нужно, допустим, каждую минуту запускать задачу заново вне зависимости от того, завершилась прошлая или нет, то ScheduledExecutorService этого не умеет.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Ares4322
Дата 14.8.2012, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 1
Всего: 3



jk1, не так.
scheduleAtFixedRate() - запускает потоки с разницей между запусками, равной period.
scheduleWithFixedDelay() - запускает потоки с разницей между запуском одной и началом другой, равной delay.
Соответственно, для первого случая нужно, чтобы были свободные потоки в пуле, если время выполнения задачи превышает period.
PM MAIL   Вверх
gpepsi
Дата 14.8.2012, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



а как завершить выполнения потока ?
PM MAIL   Вверх
jk1
Дата 14.8.2012, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Цитата

jk1, не так.


Правда?

Цитата

scheduleAtFixedRate()

Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given period; that is executions will commence after initialDelay then initialDelay+period, then initialDelay + 2 * period, and so on. If any execution of the task encounters an exception, subsequent executions are suppressed. Otherwise, the task will only terminate via cancellation or termination of the executor. If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.


Как видно из доков оно будет тормозить последующие вызовы при затягивании предыдущих, а не запускать их в параллель.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Ares4322
Дата 14.8.2012, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 1
Всего: 3



jk1, да, все так. Прошу прощения за дезинформацию.

Для остановки можно получить ScheduledFuture у scheduleAtFixedRate() и вызвать cancel().
PM MAIL   Вверх
gpepsi
Дата 14.8.2012, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 14.3.2010

Репутация: нет
Всего: нет



понятно - спасибо.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0909 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.