(tương tự như "Resettable Java Timer" nhưng có một số tinh tế tôi cần phải khám phá)timeout resettable trong Java
Tôi cần một tính năng timeout resettable, do đó nếu lớp học của tôi không thực hiện một hành động cụ thể trong một khoảng thời gian T0 (nơi T0 là trong khu phố của 50-1000msec), sau đó là một phương pháp được gọi là:
class MyClass {
static final private timeoutTime = 50;
final private SomeTimer timer = new SomeTimer(timeoutTime,
new Runnable() { public void run() {
onTimeout();
}});
private void onTimeout() { /* do something on timeout */ }
public void criticalMethod() { this.timer.reset(); }
}
tôi có thể sử dụng những gì để thực hiện điều này? Tôi quen thuộc với ScheduledExecutorService và ý tưởng gọi ScheduledFuture.cancel() và sau đó lên lịch lại nhiệm vụ có vẻ như như hoạt động, nhưng sau đó có nguy cơ tiềm ẩn nếu hủy() không thành công và tác vụ được lên lịch thực thi khi không được. Tôi cảm thấy như tôi đang thiếu một sự tinh tế ở đây.
Ngoài ra (có lẽ quan trọng hơn), có cách nào để kiểm tra việc triển khai của tôi/chứng minh rằng nó hoạt động đúng không?
chỉnh sửa: tôi đặc biệt quan tâm đến trường hợp criticalMethod()
được gọi thường (có lẽ nhiều lần mỗi millisecond) ... nếu tôi sử dụng ScheduledExecutorService, nó chỉ có vẻ như một vấn đề tài nguyên tiềm năng để giữ cho việc tạo ra các nhiệm vụ theo lịch trình mới + hủy bỏ những cái cũ, thay vì có một cách trực tiếp để lên lịch lại một nhiệm vụ.
Là phụ lục cuối cùng cho câu trả lời của tôi, bạn chắc chắn nên đọc qua Java Concurrency in Practice nếu bạn chưa có. Tất cả những ý tưởng trong câu trả lời của tôi đến từ cuốn sách đó (hoặc kinh nghiệm cá nhân, nhưng cuốn sách phù hợp với kinh nghiệm của tôi). –