Làm cách nào để đặt Timer, trong 2 phút, để thử kết nối với Cơ sở dữ liệu rồi ném ngoại lệ nếu có bất kỳ vấn đề nào trong kết nối?
Làm cách nào để đặt Timer, trong 2 phút, để thử kết nối với Cơ sở dữ liệu rồi ném ngoại lệ nếu có bất kỳ vấn đề nào trong kết nối?
Câu trả lời:
Vì vậy, phần đầu tiên của câu trả lời là làm thế nào để làm những gì đối tượng yêu cầu vì đây là cách ban đầu tôi diễn giải nó và một vài người dường như thấy hữu ích. Câu hỏi đã được làm rõ và tôi đã mở rộng câu trả lời để giải quyết vấn đề đó.
Đặt hẹn giờ
Trước tiên, bạn cần tạo Timer (Tôi đang sử dụng java.util
phiên bản tại đây):
import java.util.Timer;
..
Timer timer = new Timer();
Để chạy tác vụ một khi bạn sẽ làm:
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);
Để có nhiệm vụ lặp lại sau thời gian bạn sẽ làm:
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);
Làm một thời gian chờ nhiệm vụ
Để thực hiện cụ thể những gì câu hỏi đã làm rõ, đó là cố gắng thực hiện một nhiệm vụ trong một khoảng thời gian nhất định, bạn có thể làm như sau:
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();
}
Điều này sẽ thực thi bình thường với các ngoại lệ nếu tác vụ hoàn thành trong vòng 2 phút. Nếu nó chạy lâu hơn thế, TimeoutException sẽ bị ném.
Một vấn đề là mặc dù bạn sẽ nhận được TimeoutException sau hai phút, tác vụ sẽ thực sự tiếp tục chạy , mặc dù có lẽ cơ sở dữ liệu hoặc kết nối mạng cuối cùng sẽ hết thời gian và ném ngoại lệ vào luồng. Nhưng hãy lưu ý rằng nó có thể tiêu thụ tài nguyên cho đến khi điều đó xảy ra.
Dùng cái này
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, tôi nghĩ rằng tôi hiểu vấn đề của bạn bây giờ. Bạn có thể sử dụng một Tương lai để cố gắng làm một cái gì đó và sau đó hết thời gian sau một chút nếu không có gì xảy ra.
Ví dụ:
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] nếu ai đó muốn thực hiện hẹn giờ trên Android bằng java .
bạn cần sử dụng luồng UI như thế này để thực hiện các thao tác.
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
ActivityName.this.runOnUiThread(new Runnable(){
@Override
public void run() {
// do something
}
});
}
}, 2000));