データベースに接続しようとすると、接続に問題がある場合に例外をスローするように、2分間など、タイマーを設定するにはどうすればいいですか?
そのため、答えの最初の部分は、私が最初にそれを解釈した方法であり、少数の人々が役に立つと思われたので、被験者が尋ねることをどのようにするかです。それ以来、質問は明確にされ、私はそれを解決するために答えを広げました。
タイマーを設定する
まず、Timerを作成する必要があります(私はここでJava.util
バージョンを使用しています)。
import Java.util.Timer;
..
Timer timer = new Timer();
一度タスクを実行するには:
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);
あなたがする期間の後にタスクを繰り返すようにするには:
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);
タスクをタイムアウトさせる
明確にされた質問が尋ねること、すなわち与えられた期間タスクを実行しようとしていることを具体的にするために、あなたは以下をすることができました:
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();
}
タスクが2分以内に完了した場合、これは例外付きで正常に実行されます。それよりも長く実行されると、TimeoutExceptionがスローされます。
1つの問題は、2分後にTimeoutExceptionが発生しますが、実際にはタスクは引き続き実行されますが、おそらくデータベース接続またはネットワーク接続がタイムアウトしてスローされることです。スレッド内で例外が発生しました。しかし、それが起こるまでリソースを消費する可能性があることに注意してください。
これを使って
long startTime = System.currentTimeMillis();
long elapsedTime = 0L.
while (elapsedTime < 2*60*1000) {
//perform db poll/check
elapsedTime = (new Date()).getTime() - startTime;
}
//Throw your exception
さて、私は今あなたの問題を理解していると思います。あなたは何かをしようとする試みをするために未来を使うことができ、何も起こらなかったら少し後にタイムアウトすることができます。
例えば。:
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
}
タイマーを止めるには?このコードで何かをしたときに停止して再度プレイする
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// Your database code here
}
}, 2*60*1000, 2*60*1000);
timer.cancel();
を使うとき
それは停止しますが、フォームを閉じて再度開くと例外がスローされます。
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. i.e. 5 seconds. u can change accordngly
}
},1000*5,1000*5);
[Android] Javaを使ってAndroidにタイマーを実装しようとしている人。
操作を実行するには、このようにUIスレッドを使用する必要があります。
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
ActivityName.this.runOnUiThread(new Runnable(){
@Override
public void run() {
// do something
}
});
}
}, 2000));