2013-07-01 2 views
1

У меня немного неприятная проблема. Прямо сейчас у меня есть фрагмент кода, который запускает поток, устанавливает таймер внутри этого потока, а затем выходит из этого потока и продолжает свою жизнь. Мое намерение состояло в том, чтобы программа дождалась завершения TimerTask, прежде чем продолжить поток кода. Однако, очевидно, что создание новой TimerTask не приостанавливает выполнение, чтобы дождаться, когда таймер будет работать.Java: дождитесь завершения TimerTask перед продолжением выполнения.

Как настроить это, чтобы мой код достигнет TimerTask, ждет истечения срока действия TimerTask, а затем продолжается? Должен ли я вообще использовать таймер? Я везде искал решение, но я, похоже, не нашел его.

timer = new Timer(); 
    Thread t = new Thread(new Runnable(){ 
     boolean isRunning = true; 
     public void run() { 
      int delay = 1000; 
      int period = 1000; 
      interval = 10; 
      timerPanel.setText(interval.toString()); 

      //Scheduling the below TimerTask doesn't wait 
      //for the TimerTask to finish before continuing 
      timer.scheduleAtFixedRate(new TimerTask() { 

       public void run() { 
        timerPanel.setText(setInterval().toString()); 
       } 
      }, delay, period); 

      System.out.println("Thread done."); 
     } 
    }); 
    t.start(); 

    try { 
     t.join(); //doesn't work as I wanted 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    endTask(); 

Заранее спасибо.

EDIT: Извините за путаницу в повторяющейся задаче. Мне нужно, чтобы задача повторялась, потому что это таймер обратного отсчета, который каждую секунду отбрасывает от 10 до 0. Функция setInterval() в конечном итоге отменяет таймер. Вот соответствующий код:

private final Integer setInterval() { 
    if (interval == 1) 
     timer.cancel(); 
    return --interval; 
} 
+0

Вы пробовали [Thread.sleep] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#sleep (длинный))? –

+0

Вы запланировали повторную задачу, она никогда не завершится. –

+4

Если у вас есть это запланировано - оно будет повторяться. Если вам не нужно повторять его и нужно подождать, пока он не закончится, вам это не понадобится. просто создайте метод и назовите его – Tala

ответ

0

Вы должны использовать Thread.sleep функцию вместо TimeTask, чтобы остановить выполнение.

TimerTask не предназначен для остановки исполнения, как часы, работающие в фоновом режиме. Поэтому для вашего требования вы должны пойти за Thread.sleep.

+0

Проблема в том, что новый поток, который я создал, постоянно обновляет пользовательский интерфейс. Спящий основной поток за время, когда новая нить кажется хитроумным решением. – rkoth

0

Использование Семафор. Инициализируйте его перед объявлением задачи таймера с помощью 0 разрешений. В задаче таймера используйте блок try/finally для освобождения семафора. В основной теме, получите разрешение с семафора.

В вашем коде соединение работает как указано, так как оно ожидает завершения потока. И нет, использование потока для этого не требуется. Если вы действительно хотите заблокировать до определенного времени, вам не нужен таймер. Получите текущее время, вычислите миллины до следующего времени и sleep().

4

Я считаю, что CountDownLatch будет делать то, что вы хотите.

final CountDownLatch latch = new CountDownLatch(10); 
int delay = 1000; 
int period = 1000; 

timerPanel.setText(Long.toString(latch.getCount())); 

timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 
    public void run() { 
     latch.countDown(); 
     timerPanel.setText(Long.toString(latch.getCount())); 
    } 
}, delay, period); 

try { 
    latch.await(); 
} 
catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

timer.cancel();