Наиболее эффективный метод для потока, чтобы ждать определенное время в Java - PullRequest
4 голосов
/ 10 июля 2010

Мне известен этот вопрос здесь , но у меня есть немного другой вопрос. Если я хочу сам вручную кодировать с помощью различных методов Thread (а не с помощью служебных классов или Quartz) запуск потока в определенное время, то что будет наиболее эффективным (с точки зрения накладных расходов) закодировать это.

Я считал:

    boolean wasInterrupted = false;

    while (System.currentTimeMillis() < executionTimeInMillis) {
        try {
            Thread.sleep(X);
        } catch (InterruptedException ie) {
            wasInterrupted = true;
        }
    }

    if (!wasInterrupted) {
        doMyThing();
    }

Есть ли лучший способ? Это примитивно и наивно?

Ответы [ 2 ]

3 голосов
/ 10 июля 2010

У вас есть 3 основных возможности:

  • Thread.sleep (...) : переводит текущий исполняемый поток в спящий режим (прекращает выполнение) на указанное количество миллисекунд плюс указанное количество наносекунд, в зависимости от точности и точности системы таймеры и планировщики. Поток не теряет права собственности ни на какие мониторы ;
  • Thread.yield () : заставляет временно исполняемый объект потока временно приостанавливать работу и запускать другие потоки;
  • Мониторы : вы вызываете ожидание объекта, который хотите заблокировать, и снимаете блокировку, вызывая notify для того же объекта. Для получения дополнительной информации посмотрите на Javadoc: http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/lang/Object.html#wait()

Лучший способ - использовать мониторы, потому что вы знаете, когда получаете блокировку и когда снимаете ее. Более того, он позволяет другим потокам выполняться. Если вы хотите понять, почему следует избегать методов сна и выхода, прочитайте http://www.javamex.com/tutorials/threads/yield.shtml.

0 голосов
/ 10 июля 2010

Я бы использовал комбинацию Timer / TimerTask, начиная поток, который вы хотите запустить, в методе run () TimerTask (В качестве альтернативы вы можете просто выполнить работу непосредственно в методе run () TimerTask, который затемвыполняется в ветке таймера).Этот подход не требует блоков try / catch или цикла while, и мне кажется, что он немного более прямой.

Проверьте:

http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/util/Timer.html

http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/util/TimerTask.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...