Bagaimana cara mengatur Timer, katakanlah selama 2 menit, untuk mencoba menghubungkan ke Database kemudian membuang pengecualian jika ada masalah dalam koneksi?
Bagaimana cara mengatur Timer, katakanlah selama 2 menit, untuk mencoba menghubungkan ke Database kemudian membuang pengecualian jika ada masalah dalam koneksi?
Jawaban:
Jadi, bagian pertama dari jawabannya adalah bagaimana melakukan apa yang diminta subjek karena inilah awalnya saya menafsirkannya dan beberapa orang tampaknya merasa terbantu. Pertanyaan itu sejak diklarifikasi dan saya telah memperluas jawaban untuk mengatasinya.
Mengatur timer
Pertama, Anda perlu membuat Timer (saya menggunakan java.util
versi di sini):
import java.util.Timer;
..
Timer timer = new Timer();
Untuk menjalankan tugas setelah Anda melakukannya:
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 mengulangi tugas setelah durasi yang Anda 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 batas waktu tugas
Untuk secara spesifik melakukan apa yang ditanyakan oleh pertanyaan yang diklarifikasi, yang mencoba melakukan tugas untuk periode waktu tertentu, Anda dapat 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 dieksekusi secara normal dengan pengecualian jika tugas selesai dalam 2 menit. Jika berjalan lebih lama dari itu, TimeoutException akan dibuang.
Salah satu masalah adalah bahwa meskipun Anda akan mendapatkan TimeoutException setelah dua menit, tugas tersebut benar-benar akan terus berjalan , meskipun mungkin koneksi database atau jaringan akhirnya akan habis dan melemparkan pengecualian di utas. Tetapi waspadai itu bisa menghabiskan sumber daya sampai itu terjadi.
Gunakan ini
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, saya pikir saya mengerti masalah Anda sekarang. Anda dapat menggunakan Masa Depan untuk mencoba melakukan sesuatu dan kemudian batas waktu setelah sedikit jika tidak ada yang terjadi.
Misalnya:
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] jika seseorang ingin menerapkan timer di Android menggunakan java .
Anda perlu menggunakan utas UI 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));