2016-02-05 20 views
9

Cách tốt nhất để tiêu diệt một quy trình trong Java là gì?Cách đúng để giết một quy trình trong Java

Lấy PID và sau đó giết nó bằng Runtime.exec()?

Sử dụng destroyForcibly()?

Sự khác biệt giữa hai phương pháp này là gì và có giải pháp nào khác không?

+1

Đây có phải là quá trình của riêng bạn quá trình api hoặc quá trình khác? –

+0

là một quá trình java hay bất kỳ quá trình nào? – Derlin

+0

Đó là một quá trình không phải Java bên ngoài, nhưng cảm ơn cả hai cách Shitsu – Kariamoss

Trả lời

9

Nếu quá trình bạn muốn giết đã được bắt đầu bởi ứng dụng của bạn

Sau đó, bạn có thể có một tham chiếu đến nó (ProcessBuilder.start() hoặc Runtime.exec() cả trả về một tài liệu tham khảo). Trong trường hợp này, bạn chỉ cần gọi p.destroy(). Tôi nghĩ rằng đây là cách sạch nhất (nhưng hãy cẩn thận: các quy trình con được bắt đầu bởi p có thể vẫn hoạt động, hãy kiểm tra http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092 để biết thêm thông tin).

Chỉ sử dụng destroyForcibly nếu destroy() không thành công sau một thời gian chờ nhất định. Tóm lại

  1. quá trình chấm dứt với destroy()
  2. cho phép quá trình để kết thúc tốt đẹp với thời gian chờ hợp lý
  3. giết nó với destroyForcibly() nếu quá trình là vẫn còn sống

Nếu quá trình này bạn muốn giết là bên ngoài

Sau đó, bạn không có nhiều lựa chọn: bạn cần phải chuyển qua API hệ điều hành (Runtime.exec). Trên Windows, chương trình gọi sẽ là taskkill.exe, trong khi trên Mac và Linux bạn có thể thử kill.


Có một cái nhìn tại https://github.com/zeroturnaround/zt-exec/issues/19Killing a process using Javahttp://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app-kill-any-process-after-specified-time-0133513/ để biết thêm.

+0

Cảm ơn rất nhiều vì những lời giải thích! Đây chắc chắn là những gì tôi đang tìm kiếm – Kariamoss

4

Nếu bạn đang cố gắng để giết quá trình chính mã java của bạn bắt đầu, tôi khuyên bạn nên sử dụng System.exit(). Những lợi ích được giải thích ở đây: when should we call system exit in java.

Về cơ bản, System.exit() sẽ chạy các móc tắt sẽ đảm bảo bất kỳ quy trình không phải daemon phụ thuộc nào có thể không hoàn thành công việc của chúng bị giết trước khi quá trình của bạn bị giết. Đây là cách sạch sẽ để làm điều đó.

Nếu quá trình này không phải của bạn là, bạn sẽ phải dựa vào hệ điều hành để làm tác phẩm này với bạn như được giải thích trong câu trả lời này: Killing a Process Using Java

Trong trường hợp đó gợi ý của bạn của Runtime.exec() một kill trên * nix sẽ là một cách tốt để đi.

Bây giờ như đối với destroyForcibly(), bạn thường sẽ gọi đó là trên một quá trình con sinh ra bởi mã java của bạn mà có lẽ đã bắt đầu với ProcessBuilder.start() hoặc Runtime.exec()

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