知识大全 Java调用外部程序技巧
Posted 标准
篇首语:技艺是无价之宝,知识是智慧的明灯。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java调用外部程序技巧相关的知识,希望对你有一定的参考价值。
Java调用外部程序技巧 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
前些天使用Java调用外部程序的时候 发现线程会堵塞在waitfor()方法 调用方法如下 Process process = Runtime getRuntime() exec(cmd) process waitfor() 如果直接在Shell中调用这个程序 程序会很快结束 不会僵死 为什么会堵塞呢 原因是当调用exec(cmd)后 JVM会启动一个子进程 该进程会与JVM进程建立 个管道连接 标准输入 标准输出和标准错误流 假设该程序不断在向标准输出流和标准错误流写数据 而JVM不读取 数据会暂时缓冲在Linux的缓冲区 缓冲区满后该程序将无法继续写数据 会僵死 所以Java程序就会僵死在waitfor() 永远无法结束 解决办法就是增加两个线程 一个线程负责读标准输出流 另一个负责读标准错误流 这样子数据就不会积压在缓冲区 程序就能够顺利运行 查看源代码后 还发现一个潜在的问题 但程序执行到exec的时候 JVM会使用管道 占有 个文件句柄 但程序运行结束后 这三个句柄并不会自动关闭 这样最终会导致java io IOException: Too many open files 所以就算外部程序的没有输出 也必须关闭句柄 Process process=null; try process = Runtime getRuntime() exec(cmd) process waitfor() cache process getOutputStream() close() process getInputStream() close() process getErrorStream() close() 我们发觉当调用close()方法后 JVM并不会立即回收句柄 具体的回收时间不确定 另外如果不调用close() 句柄也会被回收 也可能发生 Too many open files 的错误 根据这篇文章 不同的垃圾收集器会选择不同的回收策略 所以最好还是要关闭 总结 如果外部程序有大量输出 需要启动额外的线程来读取标准输出和标准错误流 必须关闭三个句柄 cha138/Article/program/Java/hx/201311/26495相关参考
C#程序调用外部程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! /* * 编程语言Visu
后台调用外部程序的完美实现(Delphi) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!其基本思路
//本来看似非常简单的程序是一个界面左边一个提示有个checkbox提示用户我知道了请不要再显示右边是运行QQ的一个按钮但是弄的时候弄了四个小时左右经常是调试的时候是对的但是有的时候点了按钮过后没
工作流引擎Shark中调用外部程序的方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近看了
在PB中调用外部程序并判断其运行结束 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 您正在看的P
用Java调用doc执行程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 今天我突发奇想如果用
在Java程序中调用Matlab函数 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
谈谈各种JAVA中的调用程序方式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 很多书籍都说Ja
在Java里面调用CUI程序的方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 问题描述 该
在java里面调用CUI程序的方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 问题描述 该