suma - Cómo iniciar un hilo después de un tiempo especificado en Java
suma con hilos en java (5)
Echa un vistazo a Thread.sleep()
. Tal vez agréguelo al método de ejecución del nuevo hilo, para que duerma el tiempo necesario antes de realizar cualquier trabajo significativo.
He llamado a un método en ServletContextListener como subproceso. Ahora, según mi necesidad, tengo que retrasar el subproceso durante 1 minutos y luego comenzar a ejecutar el método llamado en el subproceso, pero no puedo hacerlo porque soy muy nuevo en esto ...
Aquí está mi código ...
public class Startup implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
public void contextInitialized(ServletContextEvent sce) {
// Do your startup work here
System.out.println("Started....");
//captureCDRProcess();
new Thread(new Runnable() {
@Override
public void run() {
captureCDRProcess();
}
}).start();
}
Por favor ayúdame .. Gracias de antemano ..
O puede retrasar la creación del hilo con Timer y TimerTask:
public void contextInitialized() {
// Do your startup work here
System.out.println("Started....");
Timer timer = new Timer();
TimerTask delayedThreadStartTask = new TimerTask() {
@Override
public void run() {
//captureCDRProcess();
//moved to TimerTask
new Thread(new Runnable() {
@Override
public void run() {
captureCDRProcess();
}
}).start();
}
};
timer.schedule(delayedThreadStartTask, 60 * 1000); //1 minute
}
Para hacer esto correctamente, necesita usar un ScheduledThreadPoolExecutor y usar el schedule funciones así:
final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(NUM_THREADS);
executor.schedule(new Runnable() {
@Override
public void run() {
captureCDRProcess();
}
}, 1, TimeUnit.MINUTES);
Thread.sleep no es el camino a seguir, porque no garantiza que se despierte después de un minuto. Dependiendo del sistema operativo y las tareas en segundo plano, podría ser de 60 segundos, 62 segundos o 3 horas, mientras que el programador anterior realmente utiliza la implementación correcta del sistema operativo para la programación y, por lo tanto, es mucho más preciso.
Además, este programador permite varias otras formas flexibles de programar tareas como a una velocidad fija o un retraso fijo.
Edición: la misma solución que usa la nueva sintaxis de Java8 Lamda:
final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(NUM_THREADS);
executor.schedule(() -> captureCDRProcess(), 1, TimeUnit.MINUTES);
Puede iniciar el thread
y dentro del hilo use sleep
método de sleep
durante un minuto.
ScheduledThreadPoolExecutor
tiene esta capacidad, pero es bastante pesada.
Aquí hay una implementación simple con una prueba (firma cercana al Handler.postDelayed() Android):
public class JavaUtil {
public static void postDelayed(final Runnable runnable, final long delayMillis) {
final long requested = System.currentTimeMillis();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
long leftToSleep = requested + delayMillis - System.currentTimeMillis();
if (leftToSleep > 0) {
Thread.sleep(leftToSleep);
}
break;
} catch (InterruptedException ignored) {
}
}
runnable.run();
}
}).start();
}
}
Prueba:
@Test
public void testRunsOnlyOnce() throws InterruptedException {
long delay = 100;
int num = 0;
final AtomicInteger numAtomic = new AtomicInteger(num);
JavaUtil.postDelayed(new Runnable() {
@Override
public void run() {
numAtomic.incrementAndGet();
}
}, delay);
Assert.assertEquals(num, numAtomic.get());
Thread.sleep(delay + 10);
Assert.assertEquals(num + 1, numAtomic.get());
Thread.sleep(delay * 2);
Assert.assertEquals(num + 1, numAtomic.get());
}