前几天发表了《Java 定时启动服务》文章,现在发表这篇文档《Java 获取系统的进程列表》,看似联系不大,实质在某些需求上还是有所关系。比如现在有这个需求:定时器启动服务时,要求启动一个“exe进程”来完成一些操作(下载图片),这时需要出入一个参数。但事实上我们已经获取到要出入的参数列表,当我们不能直接去循环遍历参数列表,因为这样的话,如果参数列表项比较多,那么每次循环都要启动一个“exe进程”,可能直接导致系统内存不足而死机。如果每次启动服务时,我们判断系统进程中是否存在该“exe进程”,或者判断该“exe进程”数不大于某个范围值,再启动服务就可以很好的避免这个问题了。下面直接上代码:
ProcessListTest.java
package com.minimax.listeren;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
*
* @包名 :com.minimax.listeren<br>
* @文件名 :ProcessListTest.java<br>
* @类描述 :判断系统进程是否存在<br>
* @作者 :Andy.wang<br>
* @创建时间 :2014-3-5上午11:25:26<br>
* @更改人 :<br>
* @更改时间 :<br>
*/
public class ProcessListTest {
public static void main(String[] args) throws IOException {
System.out.println(ProcessListTest.isRunning("QQ.exe"));
}
/**
*
* @方法名 :isRunning<br>
* @方法描述 :判断系统进程是否存在<br>
* @创建者 :Andy.wang<br>
* @创建时间 :2014-3-5上午11:25:46 <br>
* @param exeName :进程名
* @return
* 返回类型 :boolean
*/
public static boolean isRunning(String exeName) {
Process proc;
try {
proc = Runtime.getRuntime().exec("tasklist");
BufferedReader br = new BufferedReader(new InputStreamReader(proc
.getInputStream()));
String info = br.readLine();
while (info != null) {
System.out.println(info);
if (info.indexOf(exeName) >= 0) {
return true;
}
info = br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(false);
return false;
}
}
测试输出结果:
ͼ���� PID �Ự�� �Ự# �ڴ�ʹ��
========================= ====== ================ ======== ============
System Idle Process 0 Console 0 16 K
System 4 Console 0 24 K
smss.exe 876 Console 0 44 K
csrss.exe 952 Console 0 11,144 K
winlogon.exe 988 Console 0 3,796 K
services.exe 1032 Console 0 1,492 K
lsass.exe 1044 Console 0 2,340 K
ibmpmsvc.exe 1192 Console 0 200 K
svchost.exe 1224 Console 0 1,660 K
svchost.exe 1292 Console 0 1,316 K
svchost.exe 1332 Console 0 9,560 K
svchost.exe 1372 Console 0 200 K
S24EvMon.exe 1428 Console 0 1,308 K
svchost.exe 1644 Console 0 1,768 K
svchost.exe 1708 Console 0 228 K
ZhuDongFangYu.exe 1732 Console 0 2,272 K
spoolsv.exe 2020 Console 0 820 K
scardsvr.exe 168 Console 0 356 K
explorer.exe 384 Console 0 13,076 K
SGTool.exe 640 Console 0 504 K
TSVNCache.exe 696 Console 0 1,964 K
SGImeGuard.exe 784 Console 0 1,392 K
360tray.exe 844 Console 0 25,836 K
smax4pnp.exe 804 Console 0 580 K
SynTPEnh.exe 864 Console 0 2,792 K
ctfmon.exe 884 Console 0 460 K
360sd.exe 944 Console 0 1,768 K
SynTPLpr.exe 1480 Console 0 304 K
AlipaySecSvc.exe 240 Console 0 3,060 K
EvtEng.exe 304 Console 0 500 K
nmesrvc.exe 776 Console 0 44 K
unsecapp.exe 1848 Console 0 48 K
wmiprvse.exe 2084 Console 0 472 K
nmesrvc.exe 2204 Console 0 40 K
isqlplussvc.exe 2248 Console 0 200 K
TNSLSNR.EXE 2616 Console 0 3,100 K
java.exe 2648 Console 0 6,028 K
oracle.exe 2744 Console 0 70,352 K
oracle.exe 2916 Console 0 70,516 K
oracle.exe 2948 Console 0 110,964 K
oracle.exe 3012 Console 0 112,136 K
oracle.exe 3128 Console 0 71,512 K
pcas.exe 3180 Console 0 2,284 K
360rp.exe 3336 Console 0 25,020 K
RegSrvc.exe 3728 Console 0 52 K
svchost.exe 3756 Console 0 80 K
WLIDSVC.EXE 3796 Console 0 464 K
cmd.exe 3000 Console 0 44 K
cmd.exe 2976 Console 0 48 K
perl.exe 3948 Console 0 1,644 K
perl.exe 3992 Console 0 1,636 K
WLIDSVCM.EXE 2484 Console 0 48 K
360AutoClean.exe 3056 Console 0 500 K
eclipse.exe 3256 Console 0 420,216 K
emagent.exe 508 Console 0 6,508 K
perl.exe 2936 Console 0 36 K
perl.exe 2940 Console 0 36 K
perl.exe 2812 Console 0 40 K
perl.exe 4040 Console 0 36 K
perl.exe 2848 Console 0 36 K
perl.exe 2820 Console 0 36 K
nmupm.exe 3632 Console 0 36 K
perl.exe 4120 Console 0 36 K
emagent.exe 3460 Console 0 6,376 K
TaobaoProtect.exe 588 Console 0 3,792 K
alg.exe 4768 Console 0 92 K
Alipaybsm.exe 1904 Console 0 4,004 K
IEXPLORE.EXE 3172 Console 0 11,448 K
IEXPLORE.EXE 4384 Console 0 123,428 K
java.exe 4024 Console 0 26,516 K
java.exe 4132 Console 0 24,764 K
QQProtect.exe 2100 Console 0 3,024 K
QQ.exe 3332 Console 0 81,952 K
true