2012-07-06 12 views
19

¿Es posible llamar a un método en Java en un momento específico? Por ejemplo, tengo un fragmento de código como este:¿Cómo llamar a un método en una hora específica en 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(); 
} 
} 

¿Cómo se puede hacer esto en Java?

Respuesta

32

Utilizando una clase java.util.Timer puede crear un temporizador y programarlo para que se ejecute en un momento específico.

A continuación se muestra el ejemplo:

//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); 
} 
+0

donde se usa 'period'? – Sami

+0

editó la respuesta –

+1

El javadoc de Timer recomienda usar 'ScheduledThreadPoolExecutor' que se introdujo en Java 5: http://stackoverflow.com/a/11361397/829571 – assylias

6

Su es posible, y me gustaría utilizar una biblioteca como http://quartz-scheduler.org/

cuarzo es un código abierto de servicios de planificación de tareas con todas las funciones que se pueden integrar con, o se usa junto a prácticamente cualquier Java EE o Aplicación Java SE: desde la aplicación autónoma más pequeña hasta el sistema de comercio electrónico más grande. Quartz se puede usar para crear cronogramas simples o complejos para ejecutar decenas, cientos o incluso decenas de miles de trabajos; trabajos cuyas tareas se definen como componentes estándar de Java que pueden ejecutar prácticamente todo lo que pueda programar para que hagan.

2

usted podría utilizar la clase Timer

De la documentación:

Una instalación de hilos para programar tareas para la futura ejecución en un hilo de fondo. Las tareas pueden programarse para una ejecución única, o para la ejecución repetida a intervalos regulares.

El método schedule(TimerTask task, Date time) es exactamente lo que desea: programa la tarea especificada para la ejecución en el momento especificado.

Si necesita un horario en formato cron, quartz sería una buena solución. (quartz cron like schedule)

2

Como sé, puede utilizar Quartz-scheduler para esto. No lo he usado todavía, pero muchas personas me lo han recomendado.

2

Puede utilizar un ScheduledExecutorService, que es "un reemplazo más versátil para la combinación Timer/TimerTask" (según Timer's javadoc):

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

Si usted está hablando de SE a continuación, la clase Timer podría ser lo usted está buscando http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html, disponible desde Java 5.

Si necesita tiempo algo en el contexto de un servidor de aplicaciones, recomendaría echar un vistazo a los temporizadores EJB http://www.javabeat.net/2007/03/ejb-3-0-timer-services-an-overview/ disponibles desde EJB 3.0.

Alternativamente, dependiendo de lo que realmente está tratando de hacer, podría elaborar si usar un trabajo cron (o cualquier otro método de temporizador basado en sistema operativo) sería más adecuado, es decir, no quiere o no puede tener el VM funcionando todo el tiempo.

2

Es posible.Puede programar un método en algún momento usando Timer y TimerTask.

Por ejemplo:

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); 

Consulte estos enlaces:

1

demostración simple de 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")); 
Cuestiones relacionadas