`
NEO_ONE
  • 浏览: 48433 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

解决process.waitFor()阻塞

    博客分类:
  • Java
阅读更多
private static void  exeBat(){
		Process p = null; 
		
		try {  
			 p = Runtime.getRuntime().exec("tts.bat");  
			 //获取进程的标准输入流  
			 final InputStream is1 = p.getInputStream();   
			 //获取进城的错误流  
			 final InputStream is2 = p.getErrorStream();  
			 //启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流  
			 new Thread() {  
			    public void run() {  
			       BufferedReader br1 = new BufferedReader(new InputStreamReader(is1));  
			        try {  
			            String line1 = null;  
			            while ((line1 = br1.readLine()) != null) {  
			                  if (line1 != null){}  
			              }  
			        } catch (IOException e) {  
			             e.printStackTrace();  
			        }  
			        finally{  
			             try {  
			               is1.close();  
			             } catch (IOException e) {  
			                e.printStackTrace();  
			            }  
			          }  
			        }  
			     }.start();  
			                                
			   new Thread() {   
			      public void  run() {   
			       BufferedReader br2 = new  BufferedReader(new  InputStreamReader(is2));   
			          try {   
			             String line2 = null ;   
			             while ((line2 = br2.readLine()) !=  null ) {   
			                  if (line2 != null){}  
			             }   
			           } catch (IOException e) {   
			                 e.printStackTrace();  
			           }   
			          finally{  
			             try {  
			                 is2.close();  
			             } catch (IOException e) {  
			                 e.printStackTrace();  
			             }  
			           }  
			        }   
			      }.start();    
			                                
			      p.waitFor();  
			      p.destroy();   
			     System.out.println("tts退出==========================================");  
			    } catch (Exception e) {  
			         try{  
				          p.getErrorStream().close();  
				          p.getInputStream().close();  
				          p.getOutputStream().close();  
			           }catch(Exception ee){}  
			   }  
	}
分享到:
评论

相关推荐

    JAVA Process 使用

    `Process`对象的`waitFor()`方法会阻塞直到进程结束,返回值是进程的退出码: ```java int exitCode = process.waitFor(); System.out.println("Process exited with code: " + exitCode); ``` ### 6. 销毁进程 ...

    Java代码中调用shell脚本和python脚本并获得输出结果(分为小数据量和大数据量).docx

    原因是`process.waitFor()`会在输入流缓冲区填满之前阻塞,导致进程无法继续输出数据。为了解决这个问题,我们可以使用一个额外的线程来不断地从输入流中读取数据,这样就可以确保数据能够及时被处理,而不会堵塞...

    JAVA-DOS-command.rar_DOS java_dos command_java dos_shelf

    - **等待命令完成**:调用`process.waitFor()`来阻塞当前线程,直到命令执行完成。 - **清理资源**:确保关闭所有打开的流,并且在不再需要进程时调用`process.destroy()`。 3. **示例代码**: 以下是一个简单的...

    JAVA如何调用WINDOWS命令行.doc

    解决此问题的一种方法是在调用`waitFor()`之前先读取DOS窗口的标准输出缓冲区的内容。可以使用Java的`BufferedReader`来实现这一点: ```java String ls_1; Process process = Runtime.getRuntime().exec("cmd /c ...

    Java cmd命令行模拟工具

    `process.waitFor()`方法会阻塞直到命令执行完毕。 对于更复杂的命令,如需要参数、环境变量或者管道操作,可以使用`ProcessBuilder`类。例如,下面的代码创建了一个`ProcessBuilder`实例,设置了命令和参数,并将...

    JAVA调用DOS命令.pdf

    但是,需要注意的是,如果该命令是有标准输出或者是错误输出的话,必须在 waitFor 方法阻塞之前,通过读取 Process 对象的 getErrorStream 和 getInputStream 的内容来捕获所有的标准输出或者是错误输出。...

    Java调用相应cmd命令的实例

    int exitCode = process.waitFor(); // 等待命令执行完成并获取退出码 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader....

    JAVA执行可执行文件

    `waitFor()`方法会阻塞直到子进程结束,返回的`exitCode`表示进程的退出状态。 然而,`Runtime.exec()`方法有一些限制,例如处理输入/输出流可能不够灵活。为了解决这些问题,可以使用`ProcessBuilder`类。`...

    用java 调用外部程序

    process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } ``` 在这个例子中,Java启动了记事本程序。`IOException`和`InterruptedException`需要捕获,因为执行外部程序...

    xpdf-tools-kms.zip

    `process.waitFor()`会阻塞直到pdftotxt命令执行完毕,返回的`exitCode`用于检查命令是否成功执行。 这种方式的优点在于它允许你利用系统级别的资源来处理大文件,而不会过度消耗Java应用程序本身的内存。同时,...

    java调用shell脚本完美封装

    调用`Process.waitFor()`方法可以等待子进程结束并返回退出码,这可以帮助我们判断脚本是否成功执行: ```java int exitCode = process.waitFor(); System.out.println("Exit code: " + exitCode); ``` 4. **...

    Java调用linux shell脚本的方法

    为了防止输出缓冲区满导致`waitFor()`阻塞,我们需要捕获并处理这些输出。Java的`Process`类提供了`getInputStream()`和`getErrorStream()`方法来获取这些流。以下代码展示了如何读取脚本的输出: ```java ...

    Java 执行本地脚本携带多参数

    process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } ``` 2. 使用`ProcessBuilder`执行脚本: ```java String[] command = {"cmd", "/c", "script.bat", "arg1", "arg2...

    java执行可执行文件或批处理

    需要注意的是,如果命令的执行时间过长,`waitFor()`方法也会阻塞较长时间,因此在实际应用中要考虑到这一点。 ### 总结 通过Java的`Runtime`类,我们可以轻松地执行外部的可执行文件和批处理文件。这种方式不仅...

    进程交互案例

    使用`waitFor()`方法可以阻塞当前线程,直到子进程结束: ```java int exitCode = process.waitFor(); if (exitCode == 0) { System.out.println("Process completed successfully."); } else { System.out....

    java执行shell指令

    如果不想阻塞主线程,可以使用`Process`的`start()`方法异步启动命令,然后使用`waitFor()`方法等待命令执行完成。同时,为了防止内存泄漏,记得关闭所有的输入/输出流。 ```java Process process = pb.start(); ...

    执行exe文件并获取执行结果

    `waitFor()`方法会阻塞直到进程结束,返回值是进程的退出码,通常0表示成功。 值得注意的是,执行外部程序可能会受到当前用户的权限限制,因此确保.exe文件有适当的执行权限,并且Java程序有足够的权限去执行它。...

    ProcessRunner.zip

    `waitFor()`方法是`Process`类的一个成员,它阻塞当前线程,直到子进程终止,然后返回子进程的退出码。在大多数操作系统中,0表示正常退出,非零值(如1)通常表示异常或错误。这个返回值是由子进程决定的,而不是...

    Java调用Linux命令

    - `waitFor()`:阻塞当前线程,直到子进程完成。 - `destroy()`:销毁子进程,使其立即终止。 ### 示例代码 下面是一个简单的示例,演示如何使用`Runtime.exec()`来执行Linux命令“ls”: ```java public class ...

Global site tag (gtag.js) - Google Analytics