Подтвердить что ты не робот

Как вызвать метод в определенное время в java?

Можно ли вызвать метод в java в определенное время? Например, у меня есть такой код:

class Test{
 ....
// parameters 
....

public static void main(String args[]) {
   // here i want to call foo at : 2012-07-06 13:05:45 for instance
  foo();
}
}

Как это можно сделать в java?

4b9b3361

Ответ 1

Используя класс java.util.Timer, вы можете создать таймер и запланировать его запуск в определенное время.

Ниже приведен пример:

//The task which you want to execute
private static class MyTimeTask extends TimerTask
{

    public void run()
    {
        //write your code here
    }
}

public static void main(String[] args) {

    //the Date and time at which you want to execute
    DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = dateFormatter .parse("2012-07-06 13:05:45");

    //Now create the time and schedule it
    Timer timer = new Timer();

    //Use this if you want to execute it once
    timer.schedule(new MyTimeTask(), date);

    //Use this if you want to execute it repeatedly
    //int period = 10000;//10secs
    //timer.schedule(new MyTimeTask(), date, period );
}

Ответ 2

Это возможно, и я бы использовал библиотеку, такую ​​как http://quartz-scheduler.org/

Quartz - это полнофункциональная служба планирования заданий с открытым исходным кодом, которая может быть интегрирована или использоваться практически практически любым приложением Java EE или Java SE - от самого маленького автономного приложения до самой крупной системы электронной коммерции. Кварц можно использовать для создания простых или сложных графиков для выполнения десятков, сотен или даже десятков тысяч рабочих мест; задания, задачи которых определяются как стандартные компоненты Java, которые могут выполнять практически все, что вы можете запрограммировать для них.

Ответ 3

Вы можете использовать класс Timer

Из документации:

Средство для потоков для планирования задач для будущего выполнения в фоновый поток. Задачи могут быть запланированы для однократного выполнения или для повторного выполнения с регулярными интервалами.

Метод schedule(TimerTask task, Date time) - это именно то, что вы хотите: Запланирует указанную задачу для выполнения в указанное время.

Если вам нужен расписание в формате cron, quartz будет хорошим решением. (расписание кварцевого cron)

Ответ 4

Как я знаю, вы можете использовать Quartz-scheduler для этого. Я еще не использовал его, но многие люди рекомендовали его мне.

Ответ 5

Вы можете использовать ScheduledExecutorService, что является "более универсальной заменой для комбинации Timer/TimerTask" (согласно Timer javadoc):

long delay = ChronoUnit.MILLIS.between(LocalTime.now(), LocalTime.of(13, 5, 45));
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(task, delay, TimeUnit.MILLISECONDS);

Ответ 6

Если вы говорите о SE, то класс Timer может быть тем, что вы ищете http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html, доступным с Java 5.

Если вам нужно что-то время в контексте сервера приложений, я бы порекомендовал взглянуть на таймеры EJB http://www.javabeat.net/2007/03/ejb-3-0-timer-services-an-overview/, доступные с EJB 3.0.

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

Ответ 7

Это возможно. Вы можете запланировать метод в течение некоторого времени с помощью Timer и TimerTask.

Например:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 0);

Date alarmTime = calendar.getTime();

Timer _timer = new Timer();
_timer.schedule(foo, alarmTime);

Ссылки на эти ссылки:

Ответ 8

Простая демонстрация java.util.Timer

Timer t=new Timer();
t.schedule(new TimerTask() {
    public void run() {
        foo();
    }
}, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-07-06 13:40:20"));