前言
java程序都运行在jvm里,一个jvm是一个进程,同一个jvm里,多个线程运行。
所以,如果jvm挂了,那么这个jvm里面的线程也都挂了,这多一些服务端程序来说,不是很好。
所以,可以通过多个jvm来做到应用运行的隔离。
但是,这就涉及到一个问题,jvm如何管理?因为我们都知道,如果是同一个jvm,多个线程则比较好管理(可能往往并不是如此)。
1 定义
java里面用来表示进程的是Process,Process可以代表一个jvm 进程。具体的可以去看Process的注释。
2 Process的管理
Process的管理分为如何产生process,如何检测process的状态,如何kill a process。
2.1 产生process
有两种方法可以产生process,一种是通过ProcessBuilder的start方法,一种是通过Runtime的exec方法。
ProcessBuilde通过设置main函数(程序入口)来起一个jvm,新的jvm运行的则是main函数所在的process。
Runtime的exec通过运行命令来返回命令所起的process。
具体怎么操作可以去google。
2.2 检测process的状态
既然产生了process,那么肯定就要知道process的状态,只有这样才能对process进行管理。
现运行一个jvm A,如果通过A来起一个jvm运行程序B,那么A怎么知道B有没有运行成功呢?
Process有个方法getInputStream,所以Process B可以输出一些程序运行的状态,然后Process A通过Proces B的getInputStream去获取这些状态,这样Process A就能知道Process B的状态了。
如果Process B是一个服务端程序,则Process A也可以通过去检测Process B所在的port是否被占用,如果被占用,则可以认为Process B运行成功。
2.3 kill a process
kill a process之前首先知道process有没有退出,有三种方法可以检测到process有没有退出。
一种是Process有一个exitvalue方法,运行该方法,如果能够正常执行,说明能够获取到process的exitvalue,process已经exit,如果throw a exception,说明process没有exit,正在运行。
第二种是Process有一个waitfor方法,如果process的waitfor执行完成,说明process已经退出。
第三种方法是通过Process的pid是判断process有没有退出。如果判断呢?
通过Runtime的exec去执行“ps -p pid”命令,如果返回的inputstrem中包含pid,则可以认为process没有退出。
不过这样就涉及到了一个问题,如何获取Process的pid,诚然你可以通过Runtime去执行一些linux命令去获取,但是java里面也有一些工具可以获取到process的pid。
获取当前Process的pid:
ManagementFactory.getRuntimeMXBean().getName()
这个获取到的结果是一个这样的形式“pid@hostname”,例如“1234@ws”,1234是当前process的pid,ws是hostname。
获取给定process的pid:
if (process.getClass().getName().equals("java.lang.UNIXProcess")) { try { Field field = process.getClass().getDeclaredField("pid"); field.setAccessible(true); pid = field.getInt(process); } catch (Throwable e) { } }
以上获取process的pid的代码可能并不适用于所有类型的jdk。
那最后就是如何去kill 一个process了。
Process有一个destory方法,通过通过该方法去干掉一个Process,但有一个前提,你必须持有这个process的句柄。
另外也可以通过Runtime的exec去执行“kill -9 pid”来干掉一个Process,同样需要一个前提,你必须知道Process的pid。
总结:
写了一些东西,但都很浅,侧重于实践。很多细节没有写出来,这个可以根据相应的思路再去查资料。
另外,也可以通过jni去管理Process。
本文介绍了Java中进程(Process)的概念及管理方法,包括进程的创建、状态检测与终止等,并提供了具体的实现代码示例。

2645

被折叠的 条评论
为什么被折叠?



