2011-11-17 48 views
9

Nếu tôi thêm một cái móc shutdown để thời gian chạy chương trình Java của tôi như vậy:Khi Móc Shutdown Phá vỡ Bad

public class MyShutdownHook implements Runnable 
{ 
    @Override 
    public void run() 
    { 
     // Stuff I want executed anytime 
     // the program, Java, or the OS exits normally, 
     // crashes, or terminates unexpectedly for any reason. 
    } 
} 

// The in another method... 
Runtime.getRuntime().addShutdownHook(new MyShutdownHook()); 

... sau đó là có bao giờ bất kỳ tình huống mà rằng phương pháp run() sẽ không thực hiện khi chương trình/Java/OS thoát bình thường, treo máy hoặc chấm dứt đột ngột? Nếu vậy, những tình huống nào có thể bằng cách vượt qua móc tắt máy của Runtime và tại sao?

+1

Chưa bao giờ giảm giá khả năng một cuộc tấn công hạt nhân trên máy tính của bạn. –

+0

bạn có yêu cầu cung cấp thêm thông tin ngoài mô tả của javadoc về cách thức hoạt động này không? –

+0

@Mark Peters::) funny joke ... Nhưng đừng quên rằng * SIGKILL * khá nhiều * là * một waepon nguyên tử; Trên cả Linux và OS X (hai tên chỉ có hai Un * x giống như thường được sử dụng bởi các nhà phát triển) * kill -9 * được * đảm bảo * để ngay lập tức giết chết quá trình và giải phóng tài nguyên của nó, không có câu hỏi. Không * ShutDownHook *. Không có gì. Bây giờ tôi đồng ý: một quá trình Java sẽ không thấy bất kỳ sự khác biệt nào giữa * kill -9 * và tấn công hạt nhân;) – TacticalCoder

Trả lời

6
  • Nếu quá trình bị giết, móc tắt sẽ không được thực thi.

  • Nếu quá trình bị lỗi, móc tắt sẽ không được thực thi.

  • Nếu bạn có dịch vụ Windows và móc tắt sẽ mất nhiều thời gian để thực thi, nó sẽ bị chấm dứt.

+1

Hãy nhớ rằng, chỉ bị SIGKILL, SIGTERM và tương tự vẫn chạy móc tắt máy – Jarek

+2

Nếu quá trình được gửi tín hiệu SIGTERM (lệnh "kill" thông thường trong UNIX) thì hook shutdown sẽ chạy. Nó sẽ không chạy nếu được gửi SIGKILL (kill -9). – Adamski

+0

Nếu bạn muốn trở thành pedantic, nếu tôi 'kill -11 ' quá trình Java nó sẽ không chạy hook shutdown ở đó. Mặc dù tôi đoán bạn có thể nói rằng rơi dưới đạn "tai nạn". –

3

Nếu bạn kéo phích cắm ra khỏi mặt sau của máy tính thì móc kéo sẽ không chạy. Các tình huống khác bao gồm:

  • Quá trình này bị giết trên hệ điều hành POSIX với SIGKILL (-9).
  • Tương tự như vậy nếu bạn chọn chấm dứt quy trình "không hồi đáp" trong Windows, móc đóng có thể không hoàn thành.
0

Chúng chỉ chạy nếu quá trình "tắt bình thường". Nếu quá trình bị tiêu diệt mạnh mẽ từ hệ điều hành hoặc nếu quá trình này bị lỗi do sự cố tài nguyên (ví dụ: hết bộ nhớ), các móc tắt sẽ không được gọi.

0

khi bạn làm Runtime.getRuntime().halt() JVM hoặc khi hệ điều hành giết chết quá trình mà không cho phép nó chạy bất kỳ dọn dẹp, cũng có khi bạn đã thực chấm dứt chương trình (khi chạy nó dưới eclipse)

0

Bất cứ lúc nào JVM có thể thoát khỏi một cách duyên dáng, hook shutdown được chạy. Nó không chạy nếu:

  • JVM gặp sự cố. (Tùy thuộc vào cách/khi nó bị treo, móc thể vẫn chạy, nhưng không đảm bảo được thực hiện)
  • Các JVM được SIGKILL hoặc tương tự, và ngay lập tức dừng lại bởi hệ điều hành