请问在java在如何关闭java自己启动的程序呢?

Python010

请问在java在如何关闭java自己启动的程序呢?,第1张

分类: 电脑/网络 >>软件

问题描述:

请问在java在如何关闭java自己启动的程序呢?

解析:

我详细说一下吧

java程序启动之后,JVM(java虚拟机)会实例化一个Runtime类,这是一个运行时类实例,包含这个java程序运行的所有信息,一个程序会实例化一个Runtime类且只能实例化一个Runtime类。我们可以通过这个Runtime类实例操作程序的运行。它的exit(int status)方法会终止程序的运行。例:

Runtime.getRuntime().exit(0)

其中参数status表示状态,0表示正常退出,非0表示异常退出。非0参数有什么用呢?

addShutdownHook(Thread hook)方法可以将一个Thread可程序的关闭hook(挂/联系)起来,程序退出前,会执行这个方法,这样我们可以根据退出状态作相应的善后操作。

另外,System.exit(int status)也是调用这个Runtime类实例的退出方法来间接实现程序的退出的。

再加一点,Runtime类可以创建子进程,如下:

Process p=Runtime.getRuntime().exec("notepad")

这个语句将会创建一个记事本程序(它是Runtime类创建的子进程)

p.destroy()

这个语句终止刚才创建的子进程。

解决这个问题,要看这个进程是java程序自定义的进程,还是操作系统的进程,操作系统的进程,又可以分为windows进程和Linux进程

一、针对操作系统的进程:

1,首先java用户,要具有操作进程的权限

2. 针对windows操作系统的进程,比如QQ进程:

String command = "taskkill /f /im QQ.exe"  

Runtime.getRuntime().exec(command)

其中:taskkill 是命令名称,/f /im 是参数,QQ.exe是进程的可执行文件。

3.针对Linux操作系统

String command = "kill /f /im QQ.exe"  

Runtime.getRuntime().exec(command)

二、在Java程序中自定义的进程

思路:在线程中设置一个标志变量,当这个变量的值在外界被改变的时候,有机会结束运行的线程

public class T {

public static void main(String[] args) {

// 启动线程

MyThread thread = new MyThread()

new Thread(thread).start()

// 你的其它的工作,此时线程在运行中

// 你不想让线程干活了,停掉它

// 注意,这只是一个标志,具体线程何时停,并不能精确控制

thread.allDone = true

}

class MyThread implements Runnable {

boolean volatile allDone = false

public void run() {

   // 每次循环都检测标志

   // 如果设置停止标志时已经在循环里

   // 则最长需要等待一个循环的时间才能终止

   while (!allDone) {

   // 循环里的工作

   }

}

}

关闭java frame进程的方法是调用关闭的时候执行以下代码:

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

关于EXIT_ON_CLOSE的说明:

EXIT_ON_CLOSE(在 JFrame 中定义):使用 System exit 方法退出应用程序。仅在应用程序中使用。

public void exit(int status)通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。此方法从不正常返回。可以将变量作为一个状态码;根据惯例,非零的状态码表示非正常终止。 

虚拟机的关闭序列包含两个阶段。

在第一个阶段中,会以某种未指定的顺序启动所有已注册的关闭挂钩(如果有的话),并且允许它们同时运行直至结束。

在第二个阶段中,如果已启用退出终结,则运行所有未调用的终结方法。一旦完成这个阶段,虚拟机就会暂停。

      如果在虚拟机已开始其关闭序列后才调用此方法,那么若正在运行关闭挂钩,则将无限期地阻断此方法。如果已经运行完关闭挂钩,并且已启用退出终结 (on-exit finalization),那么此方法将利用给定的状态码(如果状态码是非零值)暂停虚拟机;否则将无限期地阻断虚拟机。 

System.exit 方法是调用此方法的一种传统而便捷的方式。