2009-10-23 46 views
58

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

65

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ó.

+0

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

+0

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

+0

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

14

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(); 
      } 
     } 
    }); 
+2

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

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