Tôi sử dụng ScheduledExecutorService trong đơn đăng ký của mình. Tôi cần phải sử dụng nó theo thời gian trong một số lớp Utility để chạy các chuỗi đã được lên lịch.ScheduledExecutorService: khi tắt máy nên được gọi?
Đây có phải là thiết kế tốt để giữ ScheduledExecutorService trong trường tĩnh không? Có phải là phải gọi ScheduledExecutorService.shutdown() trong trường hợp này không? Nguy cơ gì nếu tôi không gọi tắt máy?
Đó là những gì tôi nghĩ phải làm:
private static ScheduledExecutorService exec = Executors.newScheduledThreadPool(5);
public void scheduleTask(String name) {
Future<?> future = futuresMapping.get(name);
if(future!=null && !future.isDone())
future.cancel(true);
//execute once
Future<?> f = scheduledExecutor.schedule(new MyTask()), 1, TimeUnit.MINUTES);
futuresMapping.put(name, f);
}
Cảm ơn bạn
Tôi đã cố thêm lịch biểuExecutor.shutdownNow(); trong ServletContextListener của tôi, nhưng tôi gặp lỗi trong nhật ký tomcat nói "Ứng dụng web [/ servlet] dường như đã bắt đầu một chuỗi có tên [Timer-0] nhưng đã không dừng được. Điều này rất có khả năng tạo ra rò rỉ bộ nhớ. ". Làm cách nào để tránh lỗi này? Cảm ơn bạn đã trợ giúp – lili
shutdownNow() là cuộc gọi không chặn sẽ quay lại ngay lập tức. Bạn nên gọi awaitTermination() sau đó sẽ chặn cho đến khi luồng thực sự xuống. – maximdim
Tôi đã thử, nó không hoạt động. Tôi có nên đợi lâu hơn 30 giây không? Tôi đã viết thêm chi tiết trong http://stackoverflow.com/questions/9930624/tomcat7-and-scheduledexecutorservice-shutdownnow cảm ơn – lili