最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 進程執(zhí)行外部程序造成阻塞的一種原因

 更新時間:2014年03月24日 08:48:47   作者:  
前一陣子在研究文檔展示時使用了java進程直接調(diào)用外部程序,其中遇到一個問題花了好長時間才解決,這個問題就是外部程序直接執(zhí)行沒什么問題,但是當使用Java進程執(zhí)行時外部程序就阻塞在那兒不動了。而且這個外部程序在處理某些文件時使用Java進程執(zhí)行是沒問題的
查了好多資料,差點就動手翻Java源碼了,最后結合一篇文章(忘記出處了),想到了輸出流會阻塞進程執(zhí)行。 Java進程執(zhí)行有一個輸入流,兩個輸出流(相對于外部程序)。當兩個輸出流有內(nèi)容輸出,而Java執(zhí)行程序沒有及時清空輸出流時就會阻塞進程。
現(xiàn)貼出代碼,希望能幫助到有需要的同行:

復制代碼 代碼如下:
/**
  * pdf轉swf函數(shù)
  * @param path 輸入輸出文件路徑
  * @param inputFileName 輸入文件名
  * @param outputFileName 輸出文件名
  * @return File 生成的swf文件
  */
 private static File toSwf(String sourceFile, String destFile, String command) {
  long beginTime = System.nanoTime();
  Runtime rt = Runtime.getRuntime();
  try {
   Process process = rt.exec(command);

   final InputStream isNormal = process.getInputStream();
   new Thread(new Runnable() {
       public void run() {
           BufferedReader br = new BufferedReader(new InputStreamReader(isNormal));
           StringBuilder buf = new StringBuilder();
     String line = null;
     try {
      while((line = br.readLine()) != null){
       buf.append(line + "\n");
      }
     } catch (IOException e) {
      e.printStackTrace();
     }
     System.out.println("輸出結果為:" + buf);
       }
   }).start(); // 啟動單獨的線程來清空process.getInputStream()的緩沖區(qū)

   InputStream isError = process.getErrorStream();
   BufferedReader br2 = new BufferedReader(new InputStreamReader(isError));
   StringBuilder buf = new StringBuilder();
   String line = null;
   while((line = br2.readLine()) != null){
    buf.append(line + "\n");
   }
   System.out.println("錯誤輸出結果為:" + buf);

   try {
    process.waitFor();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }

  } catch (IOException e) {
   e.printStackTrace();
  }
  long endTime = System.nanoTime();
  System.out.println("轉swf耗時: " + (endTime - beginTime) / 1000000000 + " 秒  " + sourceFile);
  return new File(destFile);
 }

相關文章

  • Open?Feign之非SpringCloud方式使用示例

    Open?Feign之非SpringCloud方式使用示例

    這篇文章主要為大家介紹了Open?Feign之非SpringCloud方式使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Java排序算法總結之選擇排序

    Java排序算法總結之選擇排序

    這篇文章主要介紹了Java排序算法總結之選擇排序,較為詳細的分析了選擇排序的原理與java實現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • Java獲取Process子進程進程ID方法詳解

    Java獲取Process子進程進程ID方法詳解

    這篇文章主要介紹了Java獲取Process子進程進程ID方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • Java使用IO流實現(xiàn)音頻的剪切和拼接

    Java使用IO流實現(xiàn)音頻的剪切和拼接

    這篇文章主要為大家詳細介紹了Java使用IO流實現(xiàn)音頻的剪切和拼接,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • java實現(xiàn)掃雷小游戲

    java實現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • Java中excel表數(shù)據(jù)的批量導入方法

    Java中excel表數(shù)據(jù)的批量導入方法

    這篇文章主要為大家詳細介紹了Java中excel表數(shù)據(jù)的批量導入方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • CountDownLatch和Atomic原子操作類源碼解析

    CountDownLatch和Atomic原子操作類源碼解析

    這篇文章主要為大家介紹了CountDownLatch和Atomic原子操作類的源碼解析以及理解應用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • SpringBoot配置Clickhouse的示例代碼

    SpringBoot配置Clickhouse的示例代碼

    這篇文章主要介紹了SpringBoot配置Clickhouse的示例代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考價值,需要的朋友可以參考下
    2022-02-02
  • Springboot實現(xiàn)異步任務線程池代碼實例

    Springboot實現(xiàn)異步任務線程池代碼實例

    這篇文章主要介紹了Springboot實現(xiàn)異步任務線程池代碼實例,異步任務線程池是一種用于處理異步任務的機制,它可以提高程序的并發(fā)性能和響應速度,通過將任務提交給線程池,線程池會自動管理線程的創(chuàng)建和銷毀,從而避免了頻繁創(chuàng)建和銷毀線程的開銷,需要的朋友可以參考下
    2023-10-10
  • 詳解MybatisPlus中@Version注解的使用

    詳解MybatisPlus中@Version注解的使用

    在MyBatisPlus中,常常使用@Version實現(xiàn)樂觀鎖,該注解用于字段上面。本文將通過示例詳細講解@Version注解的使用,感興趣的可以了解一下
    2022-06-06

最新評論

柘荣县| 尚义县| 桓台县| 揭东县| 宿松县| 堆龙德庆县| 龙州县| 长岭县| 云林县| 南江县| 库尔勒市| 宜宾市| 长兴县| 吉木萨尔县| 彩票| 忻城县| 托克逊县| 望谟县| 石家庄市| 杨浦区| 当涂县| 万州区| 通辽市| 建湖县| 卫辉市| 赣州市| 荥阳市| 昂仁县| 伊金霍洛旗| 尤溪县| 广饶县| 汪清县| 抚宁县| 乌兰县| 湖南省| 容城县| 楚雄市| 蓬溪县| 蛟河市| 九寨沟县| 永福县|