Wie setze ich einen Timer in Java?

Wie setze ich einen Timer, sagen wir für 2 Minuten, um zu versuchen, eine Verbindung zu einer database herzustellen und dann eine Ausnahme auszulösen, wenn ein Problem in der Verbindung besteht?

Der erste Teil der Antwort ist also, wie das zu tun ist, was das Thema verlangt, denn so interpretierte ich es zunächst und einige Leute schienen hilfreich zu sein. Die Frage wurde seither geklärt und ich habe die Antwort darauf erweitert.

Einen Timer einstellen

Zuerst müssen Sie einen Timer erstellen (ich verwende hier die Version java.util ):

 import java.util.Timer; 

..

 Timer timer = new Timer(); 

Um die Aufgabe einmal auszuführen, tun Sie Folgendes:

 timer.schedule(new TimerTask() { @Override public void run() { // Your database code here } }, 2*60*1000); 

Um die Aufgabe nach der Dauer wiederholen zu lassen, tun Sie Folgendes:

 timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { // Your database code here } }, 2*60*1000, 2*60*1000); 

Zeitüberschreitung für eine Aufgabe

Um genau das zu tun, was die geklärte Frage verlangt, das heißt, eine Aufgabe für einen bestimmten Zeitraum auszuführen, können Sie Folgendes tun:

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

Dies wird normalerweise mit Ausnahmen ausgeführt, wenn die Aufgabe innerhalb von 2 Minuten abgeschlossen ist. Wenn es länger läuft, wird die TimeoutException ausgetriggers.

Ein Problem besteht darin, dass Sie zwar nach zwei Minuten eine TimeoutException erhalten, die Aufgabe jedoch tatsächlich weiter ausgeführt wird , obwohl vermutlich eine database- oder Netzwerkverbindung eine Zeitüberschreitung verursacht und eine Ausnahme im Thread austriggers. Aber sei dir bewusst, dass es Ressourcen verbrauchen kann, bis das passiert.

Benutze das

 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, ich denke ich verstehe dein Problem jetzt. Sie können eine Zukunft verwenden, um zu versuchen, etwas zu tun und dann nach einer Weile Timeout, wenn nichts passiert ist.

Z.B:

 FutureTask task = new FutureTask(new Callable() { @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 } 

Wie man den Timer stoppt? Stoppen und wieder spielen, wenn Sie etwas in diesem Code tun

 timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { // Your database code here } }, 2*60*1000, 2*60*1000); 

Wenn ich timer.cancel();

Es wird gestoppt, aber wenn das Formular geschlossen und erneut geöffnet wird, wird die Ausnahme ausgetriggers

 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) 
  new java.util.Timer().schedule(new TimerTask(){ @Override public void run() { System.out.println("Executed..."); //your code here //1000*5=5000 mlsec. ie 5 seconds. u can change accordngly } },1000*5,1000*5);