Tôi có một chương trình java tạo tệp khóa để đảm bảo rằng không có lệnh nào khác chạy cùng lúc với nó. Nếu chương trình chạy nó tạo ra các tập tin, và khi xuất cảnh, hoặc là thành công hoặc thông qua một ngoại lệ, tập tin được gỡ bỏ. Nhưng nếu người dùng nhấn Ctrl + C, đóng thiết bị đầu cuối hoặc theo cách khác thì ngắt kết nối, tệp sẽ không bị xóa. Có cách nào để phát hiện lệnh ngắt này và đảm bảo rằng tập tin cũng bị xóa trong trường hợp này không?Làm thế nào để hệ thống xử lý Java ngắt như Ctrl + C
Trả lời
Bạn có thể muốn xem xét shutdown hooks.
Ngoài ra, đây có lẽ là một trùng lặp hoặc gần như trùng lặp này câu hỏi trước SO từ một hoặc hai ngày trước:
Các chốt tắt máy thậm chí có chạy khi JVM bị ngắt bất thường không? Tôi sẽ nghi ngờ điều đó. –
@mmyers, điều đó phụ thuộc vào định nghĩa của bạn về bất thường. :) Ctrl-C thường sẽ kích hoạt chúng. Đóng terminal thường không. – jsight
Không có cách nào đáng sợ 100% để xóa các tập tin khóa như vậy. Timestamping họ có thể giúp đỡ, nhưng nó đi kèm với chi phí phải làm điều đó đĩa viết mỗi vài giây. Rất nhiều chương trình chỉ tìm kiếm một tệp khóa khi khởi động và nhắc người dùng về nó. – Amber
Cách duy nhất tốt để đối phó với điều này là để đánh dấu thời gian tập tin đăng nhập của bạn và cập nhật tệp nhật ký với dấu thời gian mới sau mỗi vài giây. File.deleteOnExit sẽ giúp, nhưng không có phương pháp nào là dễ dàng (điều gì xảy ra khi ai đó chỉ kéo dây điện?).
Nếu bạn viết dấu thời gian, sau đó bạn có thể kiểm tra dấu thời gian hợp lệ (được viết gần đây) và ghi đè lên tệp nhật ký nếu nó quá cũ. Bằng cách đó, một lockfile cũ sẽ không cản trở người dùng.
- 1. Gửi Ctrl-C để xử lý mở bằng Java
- 2. Ctrl + C ngắt sự kiện xử lý trong Linux
- 3. Mọi người xử lý dàn dựng hệ thống quản lý nội dung như thế nào?
- 4. Các ngắt được xử lý như thế nào trên SMP?
- 5. Làm thế nào để xử lý KeyboardInterrupt (Ctrl-c) độc đáo với pycurl?
- 6. Các ngắt bị xử lý bởi các máy xử lý kép như thế nào?
- 7. Làm thế nào để hệ thống tập tin xử lý đồng thời đọc/ghi?
- 8. Làm thế nào để xử lý một dòng mới như ngắt dòng thực trong PHP Markdown?
- 9. Vấn đề với xử lý tín hiệu, xử lý ngắt
- 10. Xử lý sự kiện CTRL + C trong Node.js trên Windows
- 11. Xử lý ngắt trong Windows
- 12. tín hiệu xử lý trong C - ngắt trong ngắt
- 13. Java xử lý các trường khi upcasting như thế nào?
- 14. thư viện thông tin hệ thống/xử lý di động
- 15. Làm cách nào để xử lý Ctrl + C trong ứng dụng bảng điều khiển Delphi?
- 16. Gửi CTRL + C tới cây con xử lý trên Windows
- 17. CLI PHP trong Windows: Xử lý các lệnh Ctrl-C?
- 18. Làm thế nào để xử lý StackOverflowError trong Java?
- 19. Làm thế nào để xử lý NullPointerException trong Java
- 20. Xử lý tổ hợp phím CTRL + C trên Win32
- 21. như thế nào một chương trình chạy trong bộ nhớ và cách bộ nhớ được xử lý bởi hệ thống
- 22. Cuộc gọi hệ thống bị gián đoạn khi nào và như thế nào?
- 23. Linux: hệ thống() + SIGCHLD xử lý + đa luồng
- 24. Cách xử lý ngắt Inter Interor
- 25. Xử lý đồng hồ hệ thống không chính xác
- 26. Làm thế nào để tạo một hệ thống cho phép như sau với Symfony 2?
- 27. Làm thế nào để xử lý một cách duyên dáng tín hiệu SIGKILL trong Java
- 28. Tạo hệ thống xử lý đơn hàng từ Magento?
- 29. Bạn tích hợp hệ thống như thế nào?
- 30. Hệ thống permalink WordPress hoạt động như thế nào?
Trớ trêu thay, tôi quên mất câu hỏi này và [trả lời] (https://stackoverflow.com/a/34188676/113632) một liên quan sáu năm (và kinh nghiệm thực tế liên quan) sau này. @Amber hoàn toàn đúng là hầu hết các ứng dụng Java nên sử dụng các móc tắt máy, nhưng để * thực sự * xử lý 'SIGINT' và các tín hiệu khác bạn cần sử dụng' sun.misc.Signal', như được thảo luận trong câu hỏi được liên kết. – dimo414