Cara mengatur Timer, mengatakan selama 2 menit, untuk mencoba untuk terhubung ke Database kemudian melemparkan pengecualian jika ada masalah di koneksi?
Jadi bagian pertama dari jawaban ini adalah cara untuk melakukan apa yang subjek bertanya seperti ini bagaimana saya awalnya ditafsirkan itu dan beberapa orang tampaknya menemukan berguna. Pertanyaan itu sejak diklarifikasi dan I've diperpanjang jawabannya ke alamat itu.
Pengaturan timer
Pertama, anda perlu membuat sebuah Timer (I'm menggunakan jawa.util
versi di sini):
import java.util.Timer;
..
Timer timer = new Timer();
Untuk menjalankan tugas setelah anda lakukan:
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);
Untuk memiliki tugas ulangi setelah durasi yang anda akan lakukan:
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);
Membuat tugas timeout
Untuk secara khusus melakukan apa yang diperjelas pertanyaannya, yang mencoba untuk melakukan tugas untuk jangka waktu tertentu, anda bisa melakukan hal berikut:
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();
}
Ini akan mengeksekusi normal dengan pengecualian jika tugas selesai dalam waktu 2 menit. Jika ini berjalan lebih lama dari itu, TimeoutException akan membuang.
Salah satu masalah adalah bahwa meskipun anda'll mendapatkan TimeoutException setelah dua menit, tugas benar-benar akan terus berjalan, meskipun mungkin database atau koneksi jaringan akhirnya akan waktu dan melemparkan pengecualian di thread. Tapi menyadari itu bisa mengkonsumsi sumber daya sampai itu terjadi.
Ok, saya pikir saya mengerti masalah anda sekarang. Anda dapat menggunakan sebuah masa Depan untuk mencoba untuk melakukan sesuatu dan kemudian setelah batas waktu sedikit jika tidak terjadi apa-apa.
E. g.:
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
}
[Android] jika seseorang mencari untuk menerapkan timer di android menggunakan java.
anda perlu menggunakan UI benang seperti ini untuk melakukan operasi.
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
ActivityName.this.runOnUiThread(new Runnable(){
@Override
public void run() {
// do something
}
});
}
}, 2000));