Có thể bắt các tín hiệu Ctrl + C trong ứng dụng dòng lệnh java không? Tôi muốn dọn sạch một số tài nguyên trước khi chấm dứt chương trình.Bắt Ctrl + C trong Java
Trả lời
Bạn có thể đính kèm một shutdown hook để VM mà được chạy bất cứ khi nào VM tắt:
Các máy ảo Java tắt để đáp ứng với hai loại sự kiện:
Chương trình thoát bình thường, khi thoát khỏi chuỗi không phải daemon cuối cùng hoặc khi phương thức thoát (tương đương, System.exit) được gọi hoặc
máy ual bị chấm dứt để phản hồi người dùng bị gián đoạn, chẳng hạn như nhập Ctrl + C hoặc sự kiện toàn hệ thống, chẳng hạn như đăng xuất người dùng hoặc tắt hệ thống.
Các chủ đề bạn vượt qua như tắt máy móc phải tuân theo một số quy tắc, mặc dù, vì vậy hãy đọc tài liệu liên quan một cách cẩn thận để tránh bất kỳ vấn đề. Điều này bao gồm việc đảm bảo an toàn luồng, chấm dứt nhanh sợi chỉ, v.v.
Ngoài ra, như bình luận Jesper chỉ ra, các móc tắt được đảm bảo chạy trên máy ảo bình thường nhưng nếu quá trình VM bị chấm dứt cưỡng bức chúng don ' t. Điều này có thể xảy ra nếu vít mã gốc xuất hiện hoặc nếu bạn buộc phải giết quá trình (kill -9
, taskkill /f
).
Nhưng trong những trường hợp đó, tất cả mọi phiên cược đều bị tắt, vì vậy tôi sẽ không lãng phí quá nhiều suy nghĩ về nó.
Chỉ cần cho mục đích thử nghiệm giao diện điều khiển nhanh chóng ...
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
Thread.sleep(200);
System.out.println("Shouting down ...");
//some cleaning up code...
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Ví dụ của bạn là RaspberryPI cụ thể ('SoftPwm',' gpio'). Bạn có thể muốn bỏ qua các cuộc gọi phương thức đó. – harpun
- 1. chụp Ctrl-c trong ruby
- 2. Gửi Ctrl-C để xử lý mở bằng Java
- 3. CTRL + C/CTRL + V không hoạt động trong Eclipse
- 4. Chụp Ctrl + C trong hộp văn bản
- 5. Java: Có thể tắt Ctrl-C trong ứng dụng bảng điều khiển Java không?
- 6. TerminateProcess vs Ctrl + C
- 7. C#: gửi ctrl + c đến bàn điều khiển chương trình bắt đầu với Process.Start()?
- 8. Tương đương với tín hiệu "SIGINT" (posix) để bắt "CTRL + C" trong Windows/MinGW
- 9. Kiểm tra phím 'Ctrl' trong C#
- 10. Cách gửi "Ctrl + c" trong Sikuli?
- 11. Ctrl-c ngừng hoạt động trong cygwin
- 12. Làm cách nào để nhận sự kiện ctrl-c? (C++)
- 13. Chấm dứt chương trình nhấn CTRL + C trong GDB
- 14. Tại sao tôi không thể đọc Ctrl + S trong C?
- 15. Tôi có thể nắm bắt tín hiệu bàn phím nào ngoài Ctrl-C?
- 16. Cách nắm bắt Ctrl + C trên Windows và Linux với Qt
- 17. Làm thế nào để bắt Ctrl + Alt + RShftKey
- 18. Di traceback bằng Python trên Ctrl-C
- 19. Cygwin CTRL-C (Ngắt tín hiệu) không hoạt động đúng cách - JVM Shutdown Hooks không bắt đầu
- 20. Tương đương với ctrl c trong lệnh hủy chương trình
- 21. Xử lý sự kiện CTRL + C trong Node.js trên Windows
- 22. Ctrl + C ngắt sự kiện xử lý trong Linux
- 23. CLI PHP trong Windows: Xử lý các lệnh Ctrl-C?
- 24. Ctrl + S preventDefault trong Chrome
- 25. CTRL-C hoạt động với chương trình Java như thế nào
- 26. Hãy thử/bắt trong Java
- 27. Bắt segfaults trong C
- 28. Làm thế nào để hệ thống xử lý Java ngắt như Ctrl + C
- 29. Cách ánh xạ Ctrl + A và Ctrl + Shift + A khác?
- 30. Bắt lỗi Java
Ghi chú rằng móc tắt máy không được đảm bảo để chạy theo mọi tình huống; có thể có những tình huống mà chúng không chạy, do đó, không thực hiện đúng chức năng của chương trình phụ thuộc vào những gì bạn làm trong một cái móc tắt máy. – Jesper
Chúng không chạy, khi quá trình được chấm dứt mạnh mẽ ('TerminateProcess()' hoặc 'SIGKILL') nhưng hoạt động bên ngoài bình thường và vì Ctrl + C đã được móc khóa tắt, nên an toàn để sử dụng nó. Bạn không thể làm gì nhiều nếu hệ điều hành thực sự chấm dứt quá trình của bạn anyway. – Joey
Nếu tôi thực hiện 'kill' (gửi tín hiệu TERM), điều này có bị kẹt trong móc tắt không? (Lưu ý rằng nó không giống như 'kill -9' mà tôi hiểu từ phía trên rằng nó sẽ không bị kẹt trong móc.) – ADTC