java process 管理

本文介绍了Java中进程(Process)的概念及管理方法,包括进程的创建、状态检测与终止等,并提供了具体的实现代码示例。

前言

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值