如何用Java关闭一个进程
发布时间:2025-05-19 19:30:22 发布人:远客网络
一、如何用Java关闭一个进程
解决这个问题,要看这个进程是java程序自定义的进程,还是操作系统的进程,操作系统的进程,又可以分为windows进程和Linux进程
1,首先java用户,要具有操作进程的权限
2.针对windows操作系统的进程,比如QQ进程:
Stringcommand="taskkill/f/imQQ.exe";
Runtime.getRuntime().exec(command);
其中:taskkill是命令名称,/f/im是参数,QQ.exe是进程的可执行文件。
其中:taskkill是命令名称,/f/im是参数,QQ.exe是进程的可执行文件。
Stringcommand="kill/f/imQQ.exe";
Runtime.getRuntime().exec(command);
二、在Java程序中自定义的进程
思路:在线程中设置一个标志变量,当这个变量的值在外界被改变的时候,有机会结束运行的线程
publicstaticvoidmain(String[]args){
//你的其它的工作,此时线程在运行中
//注意,这只是一个标志,具体线程何时停,并不能精确控制
classMyThreadimplementsRunnable{
//如果设置停止标志时已经在循环里
//则最长需要等待一个循环的时间才能终止
二、如何设计java应用程序的平滑停止
程序的退出就像关机一样,我们希望关机时平滑关机,保证所有应用程序的数据都保存了。就像现在在写得blog,希望关机的时候能被保存好到草稿箱里。
我们的的java程序中经常有一种常驻的任务或服务,如消息消费端、服务提供者,我们期望停止也是平滑的不会出现事务执行到一半产生脏数据。
java对这块的支持是通过钩子线程实现。每个java进程都可以注册钩子线程,钩子线程程在程序退出的前被执行(kill-9强制退出除外)。注册钩子线程代码如下:
Runtime.getRuntime().addShutdownHook(t);
我们可以在钩子线程里做一些善后数据清理等事情,以保证程序是平滑退出的。
一般服务或框架运行都要考虑其生命周期:
如spring容器的context.stop()方法。
再如线程池ExecutorService的shutdown方法,它会保证不接受新任务,并把未执行完的任务做完。
我们再设计服务的时候也要考虑到停止时的stop方法,以便于退出时由钩子线程调用。
注册了钩子线程后,程序收到退出信号后,会保持程序运行,直到钩子线程执行完毕,才把程序的所有线程停止并退出,下面示例代码可以说明这一点:
public static void main(String[] args){
Runtime.getRuntime().addShutdownHook(new Thread(){
Thread.currentThread().sleep(5000);
} catch(InterruptedException e){
System.out.println("clean task1 completed.");
Runtime.getRuntime().addShutdownHook(new Thread(){
Thread.currentThread().sleep(10000);
} catch(InterruptedException e){
System.out.println("clean task2 completed");
Thread.currentThread().sleep(1000);
System.out.println("sub thread is running");
} catch(InterruptedException e){
===============================================================================
注意点:钩子线程里只处理善后,目标是尽可能快的退出且不保证有脏数据。如果钩子线程里做过多事情,或者发生阻塞,那么可能出现kill失效,程序不能退出的情况,这是需要强制退出。
如以下程序会导致kill失效,需要强制退出,因为钩子线程阻塞了:
public static void main(String[] args){
Runtime.getRuntime().addShutdownHook(new Thread(){
synchronized(ShutdownFileTest.class){
ShutdownFileTest.class.wait();
} catch(InterruptedException e){
Thread.currentThread().sleep(1000);
System.out.println("sub thread is running");
} catch(InterruptedException e){
触发程序退出的在前面已经提到过,但是为了停止方便、安全和优雅,一般我们推荐几种操控性更强的退出机制。常见的推荐机制有以下几种:
在linux里用的比较多,向进程发送退出信号,java进程收到后平滑退出。
系统创建一个shutdown file.并监听shutdown file是否存在。如果发现shutdown file不存在了,那么调用System.exit,将程序退出。
如果期望只有特定的人才能终止该程序,那么你可以给文件设定权限,这样就只有特定的人可以终止程序。
public class ShutdownFileTest{
public static void main(String[] args){
Thread.currentThread().sleep(1000);
System.out.println("sub thread is running");
} catch(InterruptedException e){
File shutDownFile= new File("a.shutdown");
shutDownFile.createNewFile();
// watch for file deleted then shutdown
Thread.currentThread().sleep(1000);
} catch(InterruptedException e){
3.打开一个端口,监听端口里的命令,收到命令后调用System.exit。
通过JMX的mbean远程控制来实现。
三、java运行时死循环了怎么用命令符把它停止掉
java运行出现死循环时,在dos命令行界面下,可以直接使用ctrl+c的组合键来停止程序,ctrl+c组合键在dos命令行界面中可以不用等待程序正常运行结束,直接终止程序;还可以直接点击dos命令行界面窗口的关闭按钮来结束程序。在开发工具eclipse或者Myeclipse中,可以直接点击运行控制台中的红色按钮来结束程序。