疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java程序员的日常多进程开发


 

   

  最近再弄进程管理相关的工作,因此必要的就涉及到各种系统下关于进程的管理。

  这里简单的介绍下:

  如何在Java中执行命令

  在windows下肯定是dos命令了,而在linux则为shell命令。执行的方式差不多相同:

  方法1:Runtime

  windows版本:

  Process process = Runtime.getRuntime().exec("ipconfig /all");

  Linux版本:

  Process process = Runtime.getRuntime().exec("ifconfig -a");

  由此可以见,java程序都是相同的,只是命令不同而已。

  获得进程输出信息:

  BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

  String line = null;

  while ((line = input.readLine()) != null) {

  //TODO

  }

  获得进程错误信息:

  BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));

  String line = null;

  while ((line = error.readLine()) != null) {

  //TODO

  }

  方法2:ProcessBuilder

  比如上面的命令:

  ProcessBuilder builder = new ProcessBuilder("ipconfig","/all");

  Process process = builder.start();

  获得输出信息同上面,但是多了一个合并输出和错误的功能:

  builder.redirectErrorStream(true);

  process = builder.start();

  BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));

  String readLine;

  while (null != (readLine = br.readLine())) {

  //TODO

  }

  进程捕获

  这里捕获进程的方式,比较投机,是对比进程启动的前后差异:

  伪代码为:

  获取进程列表

  启动进程

  获取进程列表

  对比进程列表,得到最新启动的进程

  因此,就需要知道如何获得进程列表:

  windows版本获得进程列表

  Runtime.getRuntime().exec("cmd /C tasklist");

  linux版本获得进程列表

  ProcessBuilder builder = new ProcessBuilder("ps","aux");

  Process process = builder.start();

  停止进程

  同上面相似,需要使用对应版本的命令:

  windows版本停止进程

  Runtime.getRuntime().exec("cmd /C taskkill /F /PID " + pid);

  linux版本停止进程

  Runtime.getRuntime().exec("kill -9 "+pid);