进行多次测试后发现是因为没有正常退出进程,以及完全读取掉流数据,和关闭流导致的问题。

在多次优化后,建立如下封装类:

ProcessModel.java

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

/**

* Create By Qiujuer

* 2014-07-26

*

* 执行命令行语句静态方法封装

*/

public class ProcessModel {

//换行符

private static final String BREAK_LINE;

//执行退出命令

private static final byte[] COMMAND_EXIT;

//错误缓冲

private static byte[] BUFFER;

/**

* 静态变量初始化

*/

static {

BREAK_LINE = "\n";

COMMAND_EXIT = "\nexit\n".getBytes();

BUFFER = new byte[32];

}

/**

* 执行命令

*

* @param params 命令参数

*

 eg: "/system/bin/ping", "-c", "4", "-s", "100","www.qiujuer.net"

* @return 执行结果

*/

public static String execute(String... params) {

Process process = null;

StringBuilder sbReader = null;

BufferedReader bReader = null;

InputStreamReader isReader = null;

InputStream in = null;

InputStream err = null;

OutputStream out = null;

try {

process = new ProcessBuilder()

.command(params)

.start();

out = process.getOutputStream();

in = process.getInputStream();

err = process.getErrorStream();

out.write(COMMAND_EXIT);

out.flush();

process.waitFor();

isReader = new InputStreamReader(in);

bReader = new BufferedReader(isReader);

String s;

if ((s = bReader.readLine()) != null) {

sbReader = new StringBuilder();

sbReader.append(s);

sbReader.append(BREAK_LINE);

while ((s = bReader.readLine()) != null) {

sbReader.append(s);

sbReader.append(BREAK_LINE);

}

}

while ((err.read(BUFFER)) > 0) {

}

} catch (IOException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

} finally {

closeAllStream(out, err, in, isReader, bReader);

if (process != null) {

processDestroy(process);

process = null;

}

}

if (sbReader == null)

return null;

else

return sbReader.toString();

}

/**

* 关闭所有流

*

* @param out 输出流

* @param err 错误流

* @param in 输入流

* @param isReader 输入流封装

* @param bReader 输入流封装

*/

private static void closeAllStream(OutputStream out, InputStream err, InputStream in, InputStreamReader isReader, BufferedReader bReader) {

if (out != null)

try {

out.close();

} catch (IOException e) {

e.printStackTrace();

}

if (err != null)

try {

err.close();

} catch (IOException e) {

e.printStackTrace();

}

if (in != null)

try {

in.close();

} catch (IOException e) {

e.printStackTrace();

}

if (isReader != null)

try {

isReader.close();

} catch (IOException e) {

e.printStackTrace();

}

if (bReader != null)

try {

bReader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 通过Android底层实现进程关闭

*

* @param process 进程

*/

private static void killProcess(Process process) {

int pid = getProcessId(process);

if (pid != 0) {

try {

//android kill process

android.os.Process.killProcess(pid);

} catch (Exception e) {

try {

process.destroy();

} catch (Exception ex) {

}

}

}

}

/**

* 获取进程的ID

*

* @param process 进程

* @return

*/

private static int getProcessId(Process process) {

String str = process.toString();

try {

int i = str.indexOf("=") + 1;

int j = str.indexOf("]");

str = str.substring(i, j);

return Integer.parseInt(str);

} catch (Exception e) {

return 0;

}

}

/**

* 销毁进程

*

* @param process 进程

*/

private static void processDestroy(Process process) {

if (process != null) {

try {

//判断是否正常退出

if (process.exitValue() != 0) {

killProcess(process);

}

} catch (IllegalThreadStateException e) {

killProcess(process);

}

}

}

}

在进行批量压力测试到达125643个线程的时候都没有出现此问题;特此分享给大家。

process 类 java_Process 执行命令行Java封装类详解相关推荐

  1. Python必备基本技能——命令行参数args详解

    Python必备基本技能--命令行参数args详解 1. 效果图 2. 源码 2.1 简单命令行参数 2.1 轮廓检测源代码 参考 这篇博客将介绍一项开发人员.工程师和计算机科学家必备的技能--命令行 ...

  2. 命令行运行JMeter详解

    1.为什么要命令行执行脚本? 本文介绍如何从命令行运行JMeter,那么宏哥先来说说,为什么要命令行执行脚本,日常测试过程中发现,在大数量并发时,jmeterGUI界面时长宕机.卡死,在这种情况下我们 ...

  3. Outlook 2003命令行参数开关详解

    启动 Microsoft Outlook 的命令是 Outlook.exe.命令行参数开关是正斜杠后跟开关名和开关具有的任何参数. 开关的用法 查找 Microsoft Outlook 可执行文件 O ...

  4. python:argparse命令行解析模块详解

    argparse命令行解析模块学习 import argparse parser = argparse.ArgumentParser() #类似于初始化吧 parser.parse_args() #解 ...

  5. cacti命令行添加监控详解

    命令行添加监控项目主要用到几个cacti自带的php脚本,分别在cli目录下: add_device.php:添加主机 add_graphs.php:添加相应主机的监控项目 add_tree.php: ...

  6. Android中使用am命令实现在命令行启动程序详解

    在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am. 复制代码代码如下: usage: am [subcommand] [options] start an ...

  7. python 命令行解析模块_Python命令行解析模块详解

    python2.7 怎么解析命令行输入的中文参数 本文实例讲述了python读取命令行参数的方法.分享给大家供大家参考.具体分析如下: 如果想对python脚本传参数,python中对应的argc, ...

  8. 以太坊之ganache命令行参数的详解

    ganache-cli 是以太坊节点仿真器软件 ganache 的命令行版本,可以方便开发者快速进行以太坊 DApp 的开发与测试. 使用以下命令安装: npm install -g ganache- ...

  9. android 在窗口中启动应用程序,Android中使用am命令实现在命令行启动程序详解

    在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am. usage: am [subcommand] [options] start an Activity: ...

  10. Tortoisehg hg命令行工作方式详解

    一 分布式的源码管理工具Mercurial mercurial 作为3大主流的分布式源码管理工具,已经被广泛的使用. 例如 googlecode.com 和 codeplex.com 都支持mercu ...

最新文章

  1. linux文件系统dentry_NFS 文件系统源代码剖析
  2. 关于git bush 中不能复制黏贴的问题
  3. HDU 6185 Covering 矩阵快速幂 递推
  4. python获利模式_Python 分段利润提成
  5. 天津工业大学19年计算机考研大纲,2019年天津工业大学《计算机原理及接口技术》考研复试大纲...
  6. 【小知识】System.getProperties()获取系统环境变量
  7. 特斯拉同意支付150万美元和解电池电压降低的索赔
  8. oracle的sum函数精度问题_Excel中的这些烧脑问题,你遇到过几种?
  9. bzoj2257瓶子与燃料——最大公约数
  10. 概率软逻辑(PSL,Probabilistic soft logic)通用(可处理中文)版本
  11. 【算法与数据结构】哈希表-链地址法
  12. 以下c语言程序片段用于估测cpu的cache参数,优酷【C/C++类】:笔试题目1(最全)...
  13. 转贴:如何恢复Thunderbird里误删除的邮件?三种方法
  14. Julia: array =tuple, 与 ...
  15. C基础:45道练习题汇总(初学者加油)
  16. 窗口看门狗与独立看门狗区别
  17. 利用线程池来处理Excel导出功能
  18. movielens推荐_电影推荐系统movielens grouplens
  19. [普及练习场] 生活大爆炸版石头剪刀布
  20. win11家庭版开启hyper-v方法

热门文章

  1. 1.亿级流量的电商网站---概述
  2. 31.卷1(套接字联网API)---流
  3. 7.Linux 的文件权限和目录配置
  4. 49. 精简 JavaScript(10)
  5. 5. http://kb.cnblogs.com/page/90838/
  6. 29. PHP 错误控制
  7. linux怎么添加windows引导文件,Linux与Windows 10用grub引导教程
  8. background-color:#e5eecc; border:solid 1px #c3c3c3;
  9. 性能测试场景设计之用户启停设置
  10. 创建一个jFinal项目