2011-05-09 30 views
8

Tôi đã tạo một ứng dụng Java GUI có chức năng như một trình bao bọc cho nhiều quy trình bên ngoài cấp thấp. Các tiện ích hoạt động như là, nhưng đang trong nhu cầu tuyệt vọng của một cải tiến lớn.Chủ đề không chặn chạy một quy trình bên ngoài

Tôi muốn quy trình bên ngoài của mình chạy theo cách không chặn sẽ cho phép tôi cung cấp các yêu cầu bổ sung song song. Tóm lại, tôi muốn có thể xử lý dữ liệu từ quá trình bên ngoài khi dữ liệu đang được tạo ra. Nhưng nó xuất hiện cố gắng cơ bản của tôi để kiểm tra và xem nếu quá trình bên ngoài vẫn đang chạy là chặn.

Dưới đây là một đoạn trích từ lớp ExternalProcess của tôi. Vui lòng xem các nhận xét nội tuyến cho các câu hỏi chức năng Java cụ thể về việc chặn và chặn.

public void Execute() 
{ 
    System.out.println("Starting thread ...\n"); 
    Runner = new Thread(this, "ExternalProcessTest"); 
    Runner.run(); 
    System.out.println("Ending thread ...\n"); 
} 

public void run() 
{ 
    System.out.println("In run method ...\n"); // Debug purposes only. 
     // Show that we are in the run loop. 
    try 
    { 
     // Execute string command SomeCommand as background process ... 
     Process = Runtime.getRuntime().exec(SomeCommand); 
     while(IsRunning()) 
     { 
      // External process generates file IO. I want to process these 
      // files inside this loop. For the purpose of this demo I have 
      // removed all file processing to eliminate it as the cause 
      // of blocking. THIS ROUTINE STILL BLOCKS! 
      Thread.sleep(1000); 
     } 
    } 
    catch(Exception e) 
    { 
     System.out.println(e); 
    } 
    System.out.println("Exiting run method ...\n"); // Debug purposes only. 
     // Show that we are exiting the run loop. 
} 

// Process (instantiated from Runtime.getRuntime().execute doesn't supports 
// either fire-and-forget backgrounding (non-blocking) or you can wait for 
// the process to finish using the waitFor() method (blocking). I want to 
// be able to execute a non-blocking external process that I monitor via 
// threading allowing me to process the external process file IO as it is 
// created. To facilitate this goal, I have created an isRunning() method 
// that uses the exitValue() method. If the process is still running, a 
// call to exitValue() will throw an IllegalThreadStateException exception. 
// So I simply catch this execption to test if the background process is 
// finished -- at which point I can stop processing file IO from the 
// process. Is this the source of the blocking? If so, is there another 
// way to do this? 
public boolean IsRunning() 
{ 
    boolean isRunning = false; 
    try 
    { 
     int exitVal = Process.exitValue(); 
    } 
    catch(IllegalThreadStateException e) 
    { 
     isRunning = true; 
    } 
    return isRunning; 
} 

Trả lời

8

Phương thức run() trên Thread không thực sự bắt đầu một chuỗi mới, hãy thử sử dụng Thread.start() thay thế.

+1

Wow. Đó là đầu xương khá. Nhưng bạn là chính xác. Điều đó đã làm điều đó. Cảm ơn bạn rất nhiều Mike! – Rodney

+1

Tôi đã tự mình trải qua nhiều lần. :-) –

6
Runner = new Thread(this, "ExternalProcessTest"); 
Runner.run(); 

Phương thức run() được đặt tên một cách dễ hiểu. Bởi vì Thread triển khai giao diện Runnable phương thức run() được hiển thị công khai, nhưng đó là không phải phương thức phù hợp để gọi khi bạn muốn khởi chạy một chuỗi mới. Gọi số run() khiến mã chuỗi được chạy trong chuỗi hiện tại.

Bạn phải gọi start() gây ra một chủ đề mới được khởi tạo:

Runner = new Thread(this, "ExternalProcessTest"); 
Runner.start(); 
+0

Cảm ơn John. Điều đó đã làm điều đó. Tôi biết ơn thời gian bạn đã bỏ ra. – Rodney

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