您当前的位置:首页 > 互联网教程

如何用Java关闭一个进程

发布时间:2025-05-19 19:30:22    发布人:远客网络

如何用Java关闭一个进程

一、如何用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中,可以直接点击运行控制台中的红色按钮来结束程序。