`
hz_chenwenbiao
  • 浏览: 1008069 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Process的waitFor()阻塞的问题(转)

阅读更多

提要:我使用process是在用swftools转换pdf为swf文件时处理它的出错流和输入流信息,不处理会一直堵塞,并具要开启两个独立线程来处理,不然照样堵塞。下面的例程就是这个转换的处理。

 

在API中对waitFor()方法的说明是:

waitFor()
           导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。

但是如果我们在调用此方法时,如果不注意的话,很容易出现主线程阻塞,Process也挂起的情况。在调用waitFor() 的时候,Process需要向主线程汇报运行状况,所以要注意清空缓存区,即InputStream和ErrorStream,在网上,很多只提到处理InputStream,忽略了ErrorStream。以下一段代码,贴出来,仅做参考。

package com.bolue.study;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

public class ChangeSwf implements Runnable {

public void run() {
  
   String PATH_TO_SWF="D:\\Program Files\\SWFTools\\pdf2swf.exe";  
     String fromFilename="G:\\test\\read\\suanfa.pdf";
     String saveFilename="G:\\test\\read\\xiaoxiaoxxx.swf";
     
   List<String> commend = new java.util.ArrayList<String>();
   commend.add(PATH_TO_SWF);
   commend.add("-o");
   commend.add(saveFilename);
   commend.add("-t");
   commend.add(fromFilename);
   commend.add("-s");
   commend.add("languagedir="+"G:\\test\\read\\xpdf\\chinese-simplified"); 
  
   ProcessBuilder builder = new ProcessBuilder();
   builder.command(commend);
   System.out.println("---转换1开始---");
  
   try { 
    Process convertImgProcess = builder.start();
    final InputStream is1 = convertImgProcess.getInputStream();
    final InputStream is2 = convertImgProcess.getErrorStream();
    new Thread() {
      public void run() {
       BufferedReader br = new BufferedReader(
         new InputStreamReader(is1));
      
       try {
        String lineB = null;
       
        while ((lineB = br.readLine()) != null ){
         if(lineB != null)System.out.println(lineB);
        
        }
       } catch (IOException e) {
        e.printStackTrace();
       }
      
      }
     }.start(); 
    new Thread() {
      public void run() {
      
       BufferedReader br2 = new BufferedReader(
         new InputStreamReader(is2));
       try {
       
        String lineC = null;
        while ( (lineC = br2.readLine()) != null){
       
         if(lineC != null)System.out.println(lineC);
        }
       } catch (IOException e) {
        e.printStackTrace();
       }
      
      }
     }.start(); 
    convertImgProcess.waitFor();
   }catch (Exception e){ 
             System.err.println(e); 
   } 
   System.out.println("---转换1结束---");
}

}

 

分享到:
评论

相关推荐

    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如何调用WINDOWS命令行.doc

    这可能导致Java应用程序在调用`waitFor()`方法时出现阻塞。 解决此问题的一种方法是在调用`waitFor()`之前先读取DOS窗口的标准输出缓冲区的内容。可以使用Java的`BufferedReader`来实现这一点: ```java String ls...

    Java中使用Runtime和Process类运行外部程序.docx

    为避免此问题,你需要在`waitfor()`之前读取并处理`Process`的标准输出,清空缓冲区。 在处理外部进程时,一定要注意异常处理,确保正确关闭输入、输出和错误流,避免资源泄漏。同时,考虑到跨平台兼容性,可能需要...

    JAVA调用DOS命令.pdf

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

    ProcessRunner.zip

    然而,在处理这些进程时,我们可能会遇到各种问题,其中一种常见的情况是调用`process.waitFor()`方法后返回值为1,这通常表示程序执行失败。本文将深入探讨这个问题,以及如何解决。 `waitFor()`方法是`Process`类...

    java实现HTML页面转PDF亲测好用

    int exitCode = process.waitFor(); if (exitCode == 0) { System.out.println("PDF生成成功"); } else { System.out.println("PDF生成失败,退出码:" + exitCode); } } catch (IOException | ...

    操作系统对进程状态的转换

    例如,可以使用`ProcessBuilder.start()`方法创建新进程,`Process.waitFor()`方法使当前线程等待子进程完成,以及`Process.destroy()`方法来结束进程。 三、Java与操作系统进程状态的关系 Java虚拟机(JVM)自身...

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

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

    Java基于Runtime调用外部程序出现阻塞的解决方法

    总的来说,调用外部程序并处理阻塞问题的关键在于正确地读取和处理外部程序的输入/输出流,以及适当地使用`waitFor()`方法。在编写这类代码时,应考虑到各种可能的情况,确保程序的健壮性和正确性。此外,使用`...

    编程语言java批处理.pdf

    在执行之后,可以使用`Process`对象的方法来管理这个子进程,比如`waitFor()`方法可以阻塞当前线程,直到子进程结束。 另外,文档中提到了使用批处理(Batch)文件进行操作。批处理文件通常包含一系列命令,可以一...

    xpdf-tools-kms.zip

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

    执行外部程序并等待返回

    // Wait for the child process to finish WaitForSingleObject(pi.hProcess, INFINITE); // Close process and thread handles. CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } ``` 在C#中,使用`...

    JAVA如何调用DOS命令

    当执行的DOS命令有大量标准输出时,可能会遇到一个常见的问题:DOS窗口不会自动关闭,导致Java程序在`waitfor()`方法处阻塞。这是因为标准输出缓冲区可能已满。为了解决这个问题,可以使用`Process`类提供的方法来...

    Java调用linux shell脚本的方法

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

    JAVA如何调用DOS命令.doc

    - 当被调用的DOS程序有大量的标准输出时,其DOS窗口可能不会自动关闭,导致`waitfor()`方法阻塞。这是因为输出缓冲区可能已满。为解决这个问题,你可以通过`Process`对象的`getInputStream()`方法获取标准输出流,...

    Java cmd命令行模拟工具

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

    JAVA-DOS-command.rar_DOS java_dos command_java dos_shelf

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

Global site tag (gtag.js) - Google Analytics