Trong Java, có một phương pháp đặc biệt Runtime
cho điều đó: addShutdownHook
.
Điều này cho phép bạn khởi tạo một chuỗi mà JVM sẽ cố gắng chạy ngay trước khi dừng.Đó là các nơi để đặt bất kỳ dọn dẹp bạn muốn thực hiện ngay cả trong trường hợp Ctrl-C đóng cửa sổ cha mẹ. Trích xuất từ javadoc: Móc tắt chỉ đơn giản là một chuỗi được khởi tạo nhưng chưa được bắt đầu. Khi máy ảo bắt đầu trình tự tắt máy của nó, nó sẽ bắt đầu tất cả các móc tắt đã đăng ký trong một số thứ tự không xác định và cho phép chúng chạy đồng thời. Khi tất cả các móc đã hoàn thành, nó sẽ chạy tất cả các finalizers chưa được giải quyết nếu finalization-on-exit đã được kích hoạt. Cuối cùng, máy ảo sẽ dừng lại.
Móc tắt máy sẽ gọi ngay cả khi chương trình kết thúc bình thường. Trong trường hợp đó, nó là sạch để loại bỏ các móc đăng ký trước khi thoát với removeShutdownHook
(vẫn còn là một phương pháp từ Runtime
)
EDIT:
Trong trường hợp của môi trường Windows, không có tín hiệu thật, nhưng callbacks đặc biệt khi hệ thống đang tắt. AFAIK, móc hệ thống được gọi chính xác trong trường hợp đó, nhưng tôi thừa nhận tôi chưa bao giờ thực sự thử nghiệm điều đó. Trong Windows, quá trình có thể được yêu cầu chấm dứt với 2 cách:
- chức năng PostQuitMessage đăng bài viết WM_QUIT trong quá trình vòng lặp sự kiện - bình thường quá trình này nên thoát ra, nhưng nó có thể làm sạch nó (equivallent của Unix SIG_TERM)
- TerminateProcess ngay lập tức dừng quá trình và tất cả các chủ đề của nó (equivallent của Unix SIG_KILL)
quá trình điều khiển có thể sử dụng một ConsoleControlHandler có thể đánh chặn Ctrl-C, Ctrl-break hoặc Ctrl-Đóng sự kiện. Đầu tiên hai được tạo ra thông qua bàn phím, cuối cùng được tạo ra khi người dùng đóng giao diện điều khiển. Nhưng thông thường, Oracle JVM nên sử dụng cơ chế móc hệ thống khi nhận được sự kiện Ctrl-Close được xử lý giống như SIGTERM.
Nguồn
2014-11-27 09:06:02
Trả lời http://stackoverflow.com/a/20568883/4428150 cho biết cách thực hiện điều đó từ C. – Gustave