2012-03-29 29 views
10

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

Trả lời

5

Bạn nên luôn tắt lệnh shutdown() hoặc shutdownNow(). Nếu bạn không làm điều đó, ứng dụng của bạn có thể không bao giờ chấm dứt vì vẫn còn chủ đề hoạt động (tùy thuộc vào cách bạn đang chấm dứt ứng dụng của bạn, cho dù đó là trong môi trường được quản lý hay không vv).

Thông thường bạn sẽ gọi tắt máy() từ một số phương thức sự kiện vòng đời - chẳng hạn như từ DisposableBean.destroy() của Spring hoặc nếu bạn không sử dụng bất kỳ khung công tác nào, hãy gọi nó trước khi thoát khỏi ứng dụng của bạn.

+0

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

+0

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

+0

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

3

Effective Java 2nd Ed nói:

Và đây là làm thế nào để nói với người thi hành để chấm dứt một cách duyên dáng (nếu bạn không làm điều này, nó có khả năng máy ảo của bạn sẽ không thoát):

executor.shutdown();

Các vấn đề liên quan