tiempo - timer en java netbeans
¿Cómo configurar un temporizador en Java? (5)
¿Cómo configurar un temporizador, por ejemplo durante 2 minutos, para tratar de conectarse a una base de datos y luego lanzar una excepción si hay algún problema en la conexión?
Cómo detener el temporizador? Deténgase y vuelva a jugar cuando haga algo en este código
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// Your database code here
}
}, 2*60*1000, 2*60*1000);
Cuando uso timer.cancel();
se detendrá, pero si cierra el formulario y lo abre de nuevo, se lanza la excepción
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Timer already cancelled.
at java.util.Timer.sched(Timer.java:354)
at java.util.Timer.scheduleAtFixedRate(Timer.java:296)
at View.Electronic_Meeting.this_componentShown(Electronic_Meeting.java:295)
at View.Electronic_Meeting.access$000(Electronic_Meeting.java:36)
at View.Electronic_Meeting$1.componentShown(Electronic_Meeting.java:85)
at java.awt.AWTEventMulticaster.componentShown(AWTEventMulticaster.java:162)
at java.awt.Component.processComponentEvent(Component.java:6095)
at java.awt.Component.processEvent(Component.java:6043)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
De modo que la primera parte de la respuesta es cómo hacer lo que el sujeto pregunta, ya que así fue como lo interpreté inicialmente y algunas personas parecieron ser útiles. La pregunta fue aclarada desde entonces y he extendido la respuesta para abordar eso.
Configurando un temporizador
Primero necesitas crear un temporizador (estoy usando la versión de java.util
aquí):
import java.util.Timer;
..
Timer timer = new Timer();
Para ejecutar la tarea una vez que harías:
timer.schedule(new TimerTask() {
@Override
public void run() {
// Your database code here
}
}, 2*60*1000);
Para que la tarea se repita después de la duración que harías:
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// Your database code here
}
}, 2*60*1000, 2*60*1000);
Haciendo un tiempo de espera de la tarea
Para hacer específicamente lo que la pregunta aclarada hace, que es intentar realizar una tarea por un período de tiempo determinado, puede hacer lo siguiente:
ExecutorService service = Executors.newSingleThreadExecutor();
try {
Runnable r = new Runnable() {
@Override
public void run() {
// Database task
}
};
Future<?> f = service.submit(r);
f.get(2, TimeUnit.MINUTES); // attempt the task for two minutes
}
catch (final InterruptedException e) {
// The thread was interrupted during sleep, wait or join
}
catch (final TimeoutException e) {
// Took too long!
}
catch (final ExecutionException e) {
// An exception from within the Runnable task
}
finally {
service.shutdown();
}
Esto se ejecutará normalmente con excepciones si la tarea se completa en 2 minutos. Si se ejecuta más tiempo que eso, se lanzará TimeoutException.
Un problema es que, aunque obtendrá un TimeoutException después de los dos minutos, la tarea continuará ejecutándose , aunque presumiblemente, una base de datos o una conexión de red eventualmente agotarán el tiempo de espera y generarán una excepción en el hilo. Pero ten en cuenta que podría consumir recursos hasta que eso suceda.
Ok, creo que entiendo tu problema ahora. Puede usar un futuro para intentar hacer algo y luego esperar un poco si nada ha sucedido.
P.ej:
FutureTask<Void> task = new FutureTask<Void>(new Callable<Void>() {
@Override
public Void call() throws Exception {
// Do DB stuff
return null;
}
});
Executor executor = Executors.newSingleThreadScheduledExecutor();
executor.execute(task);
try {
task.get(5, TimeUnit.SECONDS);
}
catch(Exception ex) {
// Handle your exception
}
Utilizar esta
long startTime = System.currentTimeMillis();
long elapsedTime = 0L.
while (elapsedTime < 2*60*1000) {
//perform db poll/check
elapsedTime = (new Date()).getTime() - startTime;
}
//Throw your exception
new java.util.Timer().schedule(new TimerTask(){
@Override
public void run() {
System.out.println("Executed...");
//your code here
//1000*5=5000 mlsec. i.e. 5 seconds. u can change accordngly
}
},1000*5,1000*5);