public class TestShutDownHook {
2.
public TestShutDownHook() {
3.
doShutDownWork()
4.
}
5.
private void doShutDownWork() {
6.
Runtime run=Runtime.getRuntime()//当前 Java 应用程序相关的运行时对象。
7.
run.addShutdownHook(new Thread(){ //注册新的虚拟机来关闭钩子
8.
@Override
9.
public void run() {
10.
//程序结束时进行的 *** 作
11.
System.out.println("程序结束调用")
12.
}
13.
})
14.
}
15.
public static void main(String[] args) {
16.
new TestShutDownHook()
17.
for (int i = 0i <1000i++) { // 在这里增添您需要处理代码 }
18.
System.out.println(i)
19.
}
20.
}
21.
}
在java程序中,可以使用java.lang.System的exit方法来终止程序的执行,12345678
public static void main(String[] args) {System.out.println("开始进入程序...") //do somethingSystem.out.println("程序准备退出了!") System.exit(0) //下面这句话将不会打印出来System.out.println("程序已经退出了!")}
但是使用exit方法的本质是终止了JVM的运行,如果同时运行了另外一个程序,使用exit方法同样也会使该程序也终止,要避免此种情况可以使用interrupt()来中断退出一个独立运行的过程。对于多线程程序,必须要关闭各个非守护线程。
1234567891011121314151617181920212223
public static void main(String[] args) {System.out.println("开始进入程序...") //do somethingnew Thread(){public void run() {while (true) {System.out.println("我是另外的线程...") try {Thread.sleep(2000) } catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace() }}}}.start()//获取man线程Thread main = Thread.currentThread() System.out.println(main.getName()) main.interrupt() System.out.println("main线程已经退出了,但是不影响其他线程运行!") }
只有在程序非正常退出时,才使用exit方法退出程序。
解决这个问题,要看这个进程是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) {
// 循环里的工作
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)