¿Cómo configurar un temporizador, digamos durante 2 minutos, para intentar conectarse a una base de datos y luego lanzar una excepción si hay algún problema en la conexión?
¿Cómo configurar un temporizador, digamos durante 2 minutos, para intentar conectarse a una base de datos y luego lanzar una excepción si hay algún problema en la conexión?
Respuestas:
Entonces, 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 encontrar útil. La pregunta se aclaró desde entonces y he extendido la respuesta para abordar eso.
Configurar un temporizador
Primero necesitas crear un temporizador (estoy usando la java.util
versión aquí):
import java.util.Timer;
..
Timer timer = new Timer();
Para ejecutar la tarea una vez que lo haría:
timer.schedule(new TimerTask() {
@Override
public void run() {
// Your database code here
}
}, 2*60*1000);
// Since Java-8
timer.schedule(() -> /* your database code here */, 2*60*1000);
Para que la tarea se repita después de la duración que haría:
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// Your database code here
}
}, 2*60*1000, 2*60*1000);
// Since Java-8
timer.scheduleAtFixedRate(() -> /* your database code here */, 2*60*1000, 2*60*1000);
Hacer un tiempo de espera de tarea
Para hacer específicamente lo que pide la pregunta aclarada, que es intentar realizar una tarea durante 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 dura más que eso, se lanzará la TimeoutException.
Un problema es que, aunque obtendrá una TimeoutException después de los dos minutos, la tarea continuará ejecutándose , aunque presumiblemente una base de datos o una conexión de red finalmente agotarán el tiempo y generarán una excepción en el hilo. Pero tenga en cuenta que podría consumir recursos hasta que eso suceda.
Utilizar este
long startTime = System.currentTimeMillis();
long elapsedTime = 0L.
while (elapsedTime < 2*60*1000) {
//perform db poll/check
elapsedTime = (new Date()).getTime() - startTime;
}
//Throw your exception
Ok, creo que entiendo tu problema ahora. Puede usar un Futuro para intentar hacer algo y luego agotar el tiempo de espera después de un tiempo si no ha sucedido nada.
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
}
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);
[Android] si alguien busca implementar un temporizador en Android usando Java .
necesita usar un hilo de interfaz de usuario como este para realizar operaciones.
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
ActivityName.this.runOnUiThread(new Runnable(){
@Override
public void run() {
// do something
}
});
}
}, 2000));