2012-07-11 33 views
8

Quiero hacer o hilos se ejecutan en momentos exactos específicos (por ejemplo, en: 2012-07-11 13:12:24 y 2012-07-11 15:23:45)¿Cómo llamar a un hilo para que se ejecute en una hora específica en Java?

he comprobado ScheduledExecutorService, pero sólo admite la ejecución después de un período específico desde la primera ejecución y no tengo ningún período fijo, en cambio tengo horas de la base de datos para ejecutar tareas.

En una pregunta anterior para un problema diferente here, TimerTask era la solución, pero obviuosly no puede hacer enhebrar una TimerTask como Runnable y TimerTask ambos tienen el método run que debe ser implementado. La pregunta aquí si hago el hilo se extiende TimerTask y tengo una implementación de run(), ¿funcionaría? Si no, ¿cómo es posible hacer lo que estoy tratando de hacer?

+1

Refacte su solución para que no cree su propio hilo. Extienda un 'TimerTask' en su lugar. –

+0

@MarkoTopolnik que resolvería el conflicto ... pero de hecho necesito los hilos porque tendré muchas tareas (hay cuatro tipos de tareas) y quiero que cada tarea se ejecute por separado en un hilo. – Sami

+1

A continuación, cree una envoltura 'TimerTask' delgada que contenga su' Thread' como var de instancia y 'comience' su hilo a la hora programada. Incluso podría usar una subclase anónima 'TimerTask' que vea el' Thread' cerrando sobre una var. Local. Y ahora veo que eso es exactamente lo que @AkhilDev propone a continuación :) –

Respuesta

11

Usar TimerTask.

Crea un objeto TimerTask con una variable de campo como hilo. Llamar al inicio del subproceso desde la tarea del temporizador Ejecutar el método.

public class SampleTask extends TimerTask { 
    Thread myThreadObj; 
    SampleTask (Thread t){ 
    this.myThreadObj=t; 
    } 
    public void run() { 
    myThreadObj.start(); 
    } 
} 

Configúrelo así.

Timer timer new Timer(); 
Thread myThread= // Your thread 
Calendar date = Calendar.getInstance(); 
date.set(
    Calendar.DAY_OF_WEEK, 
    Calendar.SUNDAY 
); 
date.set(Calendar.HOUR, 0); 
date.set(Calendar.MINUTE, 0); 
date.set(Calendar.SECOND, 0); 
date.set(Calendar.MILLISECOND, 0); 
// Schedule to run every Sunday in midnight 
timer.schedule(
    new SampleTask (myThread), 
    date.getTime(), 
    1000 * 60 * 60 * 24 * 7 
); 
+0

Intento implementar esto, pero ¿qué pasaría si planifico la misma tarea al mismo tiempo dos veces? por ejemplo, revisé ahora las tareas pendientes y encontré t1. después de un minuto t1 todavía se debía ... así que se programó con el tiempo ... ¿Se ejecutará dos veces? – Sami

+1

ese escenario podría en realidad ser el resultado de la forma en que estoy obteniendo tareas de la base de datos ... Tengo un hilo que se ejecuta cada minuto usando el servicio executer, ese hilo busca las tareas vencidas en el próximo minuto y las busca. Si la tarea se debe solo un segundo después de esa comprobación, se considerará para la siguiente ejecución de la cadena de búsqueda ... pero como se cumplirá en un segundo después de recuperar el tiempo del subproceso, podría ejecutarse o incluso programarse con retraso. . ¿Cómo se puede mejorar esto? – Sami

+0

crea 2 instancias de la tarea, configuradas con tiempo diferente y programa ambas instancias. –

4

Creo que debería usar una biblioteca como la Quartz Scheduler. Esto es básicamente una implementación de cron para Java.

1

¿Has visto CountDownLatch del paquete java.util.concurrent? Proporciona un conteo regresivo y luego activa el (los) hilo (s) para ejecutar. Nunca tuve que usarlo yo mismo, pero lo he visto en uso un par de veces.

+0

Sería mucho más simple llamar a 'Thread.start' en el momento solicitado. –

+0

¿Qué pasa si tiene más de un 'Thread' que necesita para iniciarse simultáneamente? – posdef

+0

Un bucle 'for' podría ayudar. (Por cierto, no le baja la votación). –

Cuestiones relacionadas