[Java][Android][Process] 分享 Process 运行命令行封装类型
我在以前的文章中提到,使用Java不会有一个问题,创建运行命令来创建太多进程后创建进程行语句。
[Android] ProcessBuilder与Runtime.getRuntime().exec分别创建进程的差别
进行多次測试后发现是由于没有正常退出进程,以及全然读取掉流数据。和关闭流导致的问题。
在多次优化后,建立例如以下封装类:
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
* <p/>
* 运行命令行语句静态方法封装
*/
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 命令參数
* <pre> eg: "/system/bin/ping", "-c", "4", "-s", "100","www.qiujuer.net"</pre>
* @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线程的时候都不会发生此问题。与大家分享特此。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
[Java][Android][Process] 分享 Process 运行命令行封装类型的更多相关文章
- [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句
不管是在Java或者Android中运行命令行语句殊途同归都是创建一个子进程运行调用可运行文件运行命令.类似于Windows中的CMD一样. 此时你有两种方式运行:ProcessBuilder与Run ...
- Windows 右键快速运行命令行
原文见:右键命令行 - yacper - 博客园 方法一:配置文件夹选项 1 打开人任意文件夹,[工具] --> [文件夹选项] --> [文件类型] --> [(无)资料夹] -- ...
- 将常用的Android adb shell 命令行封装为C#静态函数
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 简介:adb命令是常用的Android命令行,自动化.代码调试.手工排查问题都会用的到,这里将常用的一些命令行封装 ...
- 自动化测试系列:将常用的Android adb shell 命令行封装为C#静态函数
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 简介:adb命令是常用的Android命令行,自动化.代码调试.手工排查问题都会用的到,这里将常用的一些命令行封装 ...
- 【Java】【转】在命令行中编译和运行java
原文:http://blog.csdn.net/u010900574/article/details/50792353 同时加载编译多个jar包和java文件 在个人平常使用或者当我们把代码部署到Li ...
- 零基础学Java(9)在mac上运行命令行提示"找不到或无法加载主类"
天坑 遇到的问题:使用命令行执行命令:java EightSample,会报以下错误 错误: 找不到或无法加载主类 EightSample 运行环境 mac系统 IntelliJ IDEA编译器 Ja ...
- Android 调试桥 (adb) 是 命令行命令--官方拷贝过来的,留作自己查看
Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信.adb 命令便于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令 ...
- JAVA核心技术I---JAVA基础知识(命令行)
一:命令行编译文件 手动在c:\temp创建cn.com.test.Man.java –即c:\temp\cn\com\test\Man.java –c:\temp可以替换成任何路径,后续命令同样替换 ...
- Windows下搭建Android NDK开发环境及命令行编译
首先说明本文内的相关安装操作参考<Pro Android C++ with the NDK>一书. 安装 Windows搭建Android NDK开发环境需要安装如下部分(同时需要配置对应 ...
随机推荐
- 陈一舟《情系人人》:先搞钱,再搞人才_DoNews-IT门户-移动互联网新闻-电子商务新闻-游戏新闻-风险投资新闻-IT社交网络社区
陈一舟<情系人人>:先搞钱,再搞人才_DoNews-IT门户-移动互联网新闻-电子商务新闻-游戏新闻-风险投资新闻-IT社交网络社区 陈一舟<情系人人>:先搞钱,再搞人才
- hadoop在实现kmeans算法——一个mapreduce实施
写mapreduce程序实现kmeans算法.我们的想法可能是 1. 次迭代后的质心 2. map里.计算每一个质心与样本之间的距离,得到与样本距离最短的质心,以这个质心作为key,样本作为value ...
- 经典回忆Effective C++ 1
c++ 联邦语言: typedef { unit C; unit Object-Oriented C++; unit Template C++; unit STL; }; notice: C++高效编 ...
- poj3126解题报告
题意:简单的说就是:有一个人门牌号是一个四位数的整数,并且还是一个素数,现在他想要换成另外一个四位数且是素数的门牌号,而且,每次都只能更换这个四位数的一个位置的数 ,也就是每换一次都只改变一个数字,而 ...
- 抢车位中的排名bug(比較使用了无符号数)
昨天把这个发在了qzone,想来还是怪怪的,还是转过来不吧,纯当发现了一个虫子,玩笑一下.只是csdn如今不能贴图,挺郁闷的,原文在http://user.qzone.qq.com/110907073 ...
- Android的目录结构说明
- HDU 4998 Rotate
题意: n次旋转 每次平面绕ai点旋转pi弧度 问 最后状态相当于初始状态绕A点旋转P弧度 A和P是多少 思路: 如果初始X点的最后状态为X'点 则圆心一定在X和X'连线的垂直平分线上 那 ...
- Custom Media Player in WPF (Part 1)
First of all I would like to welcome everyone to my new blog and wish you all a happy new year… Thro ...
- 通过angularjs的directive以及service来实现的列表页加载排序分页(转)
前两篇:(列表页的动态条件搜索,我是如何做列表页的)分别介绍了我们是如何做后端业务系统数据展示类的列表页以及动态搜索的,那么还剩下最重要的一项:数据展示.数据展示一般包含三部分: 数据列头 数据行 分 ...
- 使用NSCondition实现多线程同步
iOS中实现多线程技术有非常多方法. 这里说说使用NSCondition实现多线程同步的问题,也就是解决生产者消费者问题(如收发同步等等). 问题流程例如以下: 消费者取得锁,取产品,假设没有,则wa ...