在上一篇文章中提到,利用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个线程的时候都没有出现此问题;特此分享给大家。

更多相关文章

  1. Android(安卓)中访问SDCARD
  2. Android(安卓)Studio 怎么添加使用第三方jar包及无法编译的问题
  3. Android(安卓)Wallpaper分析
  4. 如何在Android智能手机上捕获数据包
  5. Android(安卓)iptables 今天小结
  6. 深入理解Activity启动流程(一)–Activity启动的概要流程
  7. Android(安卓)利用命令生成keystore文件
  8. 基于树莓派的 Android(安卓)Things 开发环境
  9. Android两种杀掉进程方式总结(System.exit()和Process.killProce

随机推荐

  1. Android Scroll分析(一)
  2. Android Hello World
  3. 玩Android项目开发6-----体系页面(SearchV
  4. Android获取CPU使用率的几种方式
  5. Android(安卓)|整理遇到的那些形形色色的
  6. Android中实用小知识
  7. android屏幕分辨率 的获取
  8. Android 9.0 修改默认壁纸(主壁纸和wapppa
  9. Android TextView 单行文本的坑
  10. android的BuildConfig学习