2012-01-29 4 views
9

Я хочу иметь класс, который меняет свои личные переменные каждые 2 секунды. Я знаю, что если я делаю что-то вродеСоздание повторяющегося напоминания по таймеру в Java

import java.util.Timer; 
//... 
Timer timer; 
//... 
timer.schedule(new ChangeSomething(), 2000); 

Он будет выполнять ChangeSomething() после 2 секунд, есть способ, чтобы сказать ему, чтобы сделать что-то каждые 2 секунды, или, если я положил внутрь ChangeSomething()

timer.schedule(new ChangeSomething(), 2000); 

будет ли это работать?

На боковой ноте, что делает timer.cancel() точно?

ответ

11

Используйте timer.scheduleAtFixedRate(), чтобы запланировать его повторялись каждые две секунды:

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

Из Javadoc для Timer.cancel():

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

EDIT:

Относительно внутренней резьбой исполнения для Timer, который выполняет одну задачу один раз:

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

+0

То, что я не понимаю, о timer.cancel(), это является ли это необходимо сделать после того, как я сделать задачу, что это был запланировано только один раз, чтобы убедиться, что это не будет сделано снова или нет? – SIMEL

+0

Javadoc для 'Timer' указывает, что это не требуется, и поток exeecution таймера завершится. Однако в нем конкретно говорится, что это может занять сколь угодно долгое время, а 'cancel()' может использоваться для его более быстрого завершения. (Вставка соответствующего абзаца из Джавадока в ответ). – hmjd

0

Чтобы быть более точным здесь: ChangeSomething() является конструктором вашего класса ChangeSomething. Конструктор будет выполняться немедленно, когда вы передаете объект ChangeSomething instace на таймер, а не через 2 секунды. Этот метод запуска объекта() будет запущен через 2 секунды.

Чтобы выполнить этот метод запуска() несколько раз все 2 секунды, используйте schedule(TimerTask task, long delay, long period)

6

Вам нужно будет позвонить в другой метод планирования Таймера, называется scheduleAtFixedRate (...), который может получить 3 параметра. Первые 2 идентичны тем, которые вы использовали, в то время как третий параметр указывает период времени в миллисекундах между последовательными выполнением задач.

import java.util.Timer; 
//... 
Timer timer; 
//... 
timer.scheduleAtFixedRate(new ChangeSomething(), 2000, 2000); 

Вы можете проверить Java пай док для этого метода можно здесь: http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html#scheduleAtFixedRate(java.util.TimerTask, java.util.Дата, длинные)

2

Вот пример

import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 

public class Test extends TimerTask { 
    private int age; 

    public Test() { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(this, new Date(), 2000); 
    } 

    /** 
    * Implements TimerTask's abstract run method. 
    */ 
    public void run(){ 
     //toy implementation 
     System.out.print("Changing Data ... before change age is "+age+" "); 
     changeAge(); 
     System.out.println("after change age is "+age); 

    } 


    private void changeAge() { 
     age = (int)Math.round(Math.random()*1000); 
    } 

    public static void main(String[] args) { 
      new Test(); 
    } 

}

+0

новый таймер(); = не возможно, вам нужно добавить параметры правильно? –

+0

@SvenB В соответствии с документами Java: http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html, у Timer есть конструктор по умолчанию. –

Смежные вопросы