2008-11-04 43 views
14

Tôi khởi chạy một tiến trình con trong Java như sau:Làm cách nào để loại bỏ các quy trình con Java khi ứng dụng Java của tôi thoát/bị treo?

final String[] cmd = {"<childProcessName>"}; 
Process process = Runtime.getRuntime().exec(cmd); 

Nó hiện đang chạy ẩn. Tất cả tốt và tốt.

Nếu chương trình của tôi bây giờ bị treo (nó vẫn còn trong dev :-)) quá trình con vẫn dường như treo xung quanh. Làm thế nào tôi có thể làm cho nó tự động kết thúc khi quá trình Java mẹ chết?

Nếu có ích, tôi đang sử dụng Mac OS X 10.5

Trả lời

10

Như bạn đã nói, addShutdownHook là cách để thực hiện.

NHƯNG:

  • Không có bảo đảm thực sự mà móc tắt máy của bạn được thực hiện nếu chương trình kết thúc. Ai đó có thể giết quá trình Java và trong trường hợp đó, hook tắt máy của bạn sẽ không được thực hiện. (như đã nói trong số này SO question)

  • một số thư viện chuẩn có móc riêng có thể chạy trước máy của bạn.

  • hãy cẩn thận về các bế tắc.

Một khả năng khác sẽ là wrap your java program in a service.

8

Tôi đã tự làm việc đó. Tôi thêm móc tắt máy, như sau:

final String[] cmd = {"<childProcessName>"}; 
final Process process = Runtime.getRuntime().exec(cmd); 
Runnable runnable = new Runnable() { 
    public void run() { 
     process.destroy(); 
    } 
}; 
Runtime.getRuntime().addShutdownHook(new Thread(runnable)); 
Các vấn đề liên quan