如何在windows下管理不同的java进程

Python028

如何在windows下管理不同的java进程,第1张

在windows下运行java程序的启动脚本:

java -classpath 需要加入classpath的内容列表,以分号分割 需要执行的程序.jar

如:

java -classpath hello.properties hello.jar

将其保存为startup.bat。

启动后,发现黑色的cmd框框一直讨厌的呆在那里,并且在进程管理器中查看该进程为java.exe。如果一台服务器上跑了很多个这样的进程后你就会发现,不小心关闭这些cmd框框带来的后果是致命的,轻则服务中断,重则工资被扣。怎么去掉那个讨厌的cmd框框呢?也许用javaw可以解决问题。

javaw -classpath hello.properties hello.jar

框框还在那里,但是关闭一下试试,嘿嘿,javaw.exe这个进程还在,看来是比刚才进步了哦。

那么如何自动关闭这个cmd框框呢?

start javaw -classpath hello.properties hello.jar

在运行一次试试,HOHO,我们的目的打到了,启动后,cmd框框自动关闭了。

这个貌似是没有问题的,但是当你需要运行几个甚至十几个jar程序后,你会在进程管理器中发现长长的一排javaw.exe,根本无法监测某个进程消耗的资源,怎么来区别每一个javaw到底运行的是什么程序呢?

由于这些javaw都指向了%JAVA_HOME%/bin/javaw.exe,我们可以在javaw.exe上面动动脑筋。我们复制几个javaw.exe文件在bin目录,将其中的一些改名为hello.exe,world.exe等等你需要显示在进程管理器中的名字,然后将启动脚本修改为这样:

start C:/Progra~1/Java/jdk1.x.x_xx/bin/hello -classpath hello.properties hello.jar

注意,Progra~1是替代Program Files的有效写法,表示Progra开头的第一个文件夹。如果你的JDK路径没有空格,也可以使用全路径代替。

这样改过之后,在进程管理器中会发现每个不同的java进程变成了hello.exe,world.exe了,这样可以方便的查看每个进程的资源占用情况,甚至是强行关闭这个进程了。

在Linux下,这个过程及其简单:

ps -fe|grep hello

就看到了hello.jar这个进程了。

Java中多进程编程的实现,和多线程一样,多进程同样是实现并发的一种方式,需要的朋友可以参考下

1.Java进程的创建

Java提供了两种方法用来启动进程或其它程序:

(1)使用Runtime的exec()方法

(2)使用ProcessBuilder的start()方法

1.1 ProcessBuilder

ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。

每个 ProcessBuilder 实例管理一个进程属性集。start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。

每个进程生成器管理这些进程属性:

命令 是一个字符串列表,它表示要调用的外部程序文件及其参数(如果有)。在此,表示有效的操作系统命令的字符串列表是依赖于系统的。例如,每一个总体变量,通常都要成为此列表中的元素,但有一些操作系统,希望程序能自己标记命令行字符串——在这种系统中,Java 实现可能需要命令确切地包含这两个元素。

环境 是从变量 到值 的依赖于系统的映射。初始值是当前进程环境的一个副本(请参阅 System.getenv())。

工作目录。默认值是当前进程的当前工作目录,通常根据系统属性 user.dir 来命名。

redirectErrorStream 属性。最初,此属性为 false,意思是子进程的标准输出和错误输出被发送给两个独立的流,这些流可以通过 Process.getInputStream() 和 Process.getErrorStream() 方法来访问。如果将值设置为 true,标准错误将与标准输出合并。这使得关联错误消息和相应的输出变得更容易。在此情况下,合并的数据可从 Process.getInputStream() 返回的流读取,而从 Process.getErrorStream() 返回的流读取将直接到达文件尾。