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

本文介绍了一个使用Java实现的PDF文件转换为SWF文件的过程。通过调用外部程序pdf2swf并处理其输出流和错误流,确保了转换过程的顺利进行。文中详细展示了如何通过启动独立线程来读取和处理输入流及错误流,避免了主线程阻塞的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提要:我使用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结束---");
}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值