2009-07-16 29 views
5

Tôi muốn nó khi người dùng của tôi bắt đầu chương trình của tôi từ dòng lệnh và sau đó giết quá trình (ctrl + c, ví dụ) chương trình sẽ tắt máy một cách duyên dáng bằng cách đóng tất cả các kết nối của nó. Điều này thậm chí có thể? Tôi không thể chỉ có nó gọi một phương pháp khi đóng như một GUI có thể? Chương trình này không có GUI.JAVA: làm thế nào để gọi một phương thức khi quá trình đã bị dừng (thậm chí có thể không?)

Vui lòng cho tôi biết.

+0

Chỉ cần nhận thấy điều này trông giống như một câu hỏi trùng lặp: http://stackoverflow.com/questions/264825/get-notification-on-a-java-process-termination/264833 –

Trả lời

8

Here is a pretty good guide to signal handling in Java. Nó bao gồm các trường hợp tắt máy và chấm dứt, bao gồm cả Ctrl-C.

Cuộc gọi cụ thể bạn muốn có trong Thời gian chạy, addShutdownHook.

Vẫn còn các trường hợp cụ thể mà bạn không thể xử lý ... thường có một số cách cho hệ điều hành vừa mới hoàn toàn xóa ứng dụng mà không cho phép cơ hội lưu chính nó. Bạn không thể bao gồm mọi trường hợp thông qua cơ chế này. Để báo cho JavaDoc

Trong trường hợp hiếm hoi, máy ảo có thể hủy, nghĩa là, ngừng chạy mà không tắt máy sạch. Điều này xảy ra khi máy ảo bị chấm dứt bên ngoài, ví dụ với tín hiệu SIGKILL trên Unix hoặc cuộc gọi TerminateProcess trên Microsoft Windows. Máy ảo cũng có thể hủy bỏ nếu một phương thức nguyên bản bị hỏng, ví dụ, làm hỏng cấu trúc dữ liệu nội bộ hoặc cố gắng truy cập bộ nhớ không tồn tại. Nếu máy ảo hủy bỏ thì không có sự bảo đảm nào có thể được thực hiện về việc có hay không bất kỳ móc tắt máy nào sẽ được chạy.

+1

Có thể hiển nhiên, nhưng dù sao tôi cảm thấy bắt buộc phải chỉ ra rằng nếu quá trình này bị giết chết (SIGKILL trong Unix, 'taskkill/f' trong Windows), thì không có cách nào nó có thể phát hiện ra thực tế hoặc làm bất cứ điều gì. Nó chỉ chết ngay tại đó và sau đó, trừ khi nó trong giấc ngủ liên tục (và nếu có, nó sẽ chết ngay lập tức khi nó rời khỏi trạng thái đó). –

+0

Điểm tốt; Tôi đã cập nhật để bao gồm điều đó. –

+0

Tất nhiên, tính năng của nó giống như chúng ta có 'shutdown abort' trong Oracle. Người ta không thể giúp đỡ, và không nên, bởi vì khắc phục điều này là tương tự như thu hồi quyền người dùng, IMO. –

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