‘壹’ 如何关闭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程序
Ctrl+Shift+Esc打开任务管理器,选择进程,找到java进程,关掉它
‘叁’ eclipse中怎样停止正在运行的java多线程,用什么快捷键,谢谢
我想这个是没有快捷键的,你可以在控制台里面使用terminate终止程序,或者在任务管理器里面终止java应用程序的运行
‘肆’ java中终止程序的执行
想直接整个程序的结束用System.exit(0);
如果是在for循环,while或if中尝试用return ,break等
‘伍’ 如何用Java关闭一个进程
解决这个问题,要看这个进程是java程序自定义的进程,还是操作系统的进程,操作系统的进程,又可以分为windows进程和linux进程
一、针对操作系统的进程:
1,首先java用户,要具有操作进程的权限
2. 针对windows操作系统的进程,比如QQ进程:
Stringcommand="taskkill/f/imQQ.exe";
Runtime.getRuntime().exec(command);
其中:taskkill 是命令名称,/f /im 是参数,QQ.exe是进程的可执行文件。
3.针对Linux操作系统
Stringcommand="kill/f/imQQ.exe";
Runtime.getRuntime().exec(command);
二、在Java程序中自定义的进程
思路:在线程中设置一个标志变量,当这个变量的值在外界被改变的时候,有机会结束运行的线程
publicclassT{
publicstaticvoidmain(String[]args){
//启动线程
MyThreadthread=newMyThread();
newThread(thread).start();
//你的其它的工作,此时线程在运行中
//你不想让线程干活了,停掉它
//注意,这只是一个标志,具体线程何时停,并不能精确控制
thread.allDone=true;
}
}
{
booleanvolatileallDone=false;
publicvoidrun(){
//每次循环都检测标志
//如果设置停止标志时已经在循环里
//则最长需要等待一个循环的时间才能终止
while(!allDone){
//循环里的工作
}
}
}
‘陆’ java停止当前程序
break return此外continue也能终止本次循环,从线程方面讲可以使用 Thread.currentThread().stop(); Thread.currentThread()是获取当前线程的方法,然后调用Thread的stop()方法终止线程,如果不想异常抛出错误,可以自定义一个异常类,捕捉异常即可
‘柒’ java怎么杀掉java进程
java中有调用外部程序的类,Runtime.getRuntime().exec("./**.exe");此函数返回的是一个Process 对象,该对象在创建后,可以对它进行 destroy () 杀掉子进程、 waitFor () 导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。 如下例子可以杀掉已经打开的文本进程:
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
publicclassTest
{
publicstaticvoidmain(String[]args)
{
try
{
String[]cmd=
{"notepad.exe"};
Processproc=Runtime.getRuntime().exec(cmd);//开启文本
BufferedReaderin=newBufferedReader(newInputStreamReader(proc
.getInputStream()));
Stringstring_Temp=in.readLine();
while(string_Temp!=null)
{
System.out.println(string_Temp);
if(string_Temp.indexOf("notepad.exe")!=-1)
Runtime.getRuntime().exec("Taskkill/IMnotepad.exe");
string_Temp=in.readLine();
}
}
catch(Exceptione)
{
//结束进程
}
}
结果如下:
‘捌’ java程序通过命令停止
tasklist命令找到该程序的进程,taskkill杀掉该进程。
tomcat的启动、结束bat都是调用org.apache.catalina.startup.Bootstrap这个类实现的,startup.bat最终会执行Bootstrap.java里的
publicvoidstart()throwsException{
if(catalinaDaemon==null)init();
Methodmethod=catalinaDaemon.getClass().getMethod("start",(Class[])null);
method.invoke(catalinaDaemon,(Object[])null);
}
shutdown.bat最终会执行Bootstrap里的
publicvoidstopServer()throwsException{
Methodmethod=catalinaDaemon.getClass().getMethod("stopServer",(Class[])null);
method.invoke(catalinaDaemon,(Object[])null);
}
你也可以这样写一个类来控制程序的启动、终止,bat就调用对应的方法。
‘玖’ 什么情况下OOM会终止java进程
防止重要的系统进程触发(OOM)机制而被杀死:可以设置参数/proc/PID/oom_adj为-17,可临时关闭linux内核的OOM机制。内核会通过特定的算法给每个进程计算一个分数来决定杀哪个进程,每个进程的oom分数可以/proc/PID/oom_score中找到。我们运维过程中保护的一般是sshd和一些管理agent。
保护某个进程不被内核杀掉可以这样操作:
# echo -17 > /proc/$PID/oom_adj
如何防止sshd被杀,可以这样操作:
# pgrep -f "/usr/sbin/sshd" | while read PID;do echo -17 > /proc/$PID/oom_adj;done
可以在计划任务里加入这样一条定时任务,就更安全了:
#/etc/cron.d/oom_disable
*/1**** root pgrep -f "/usr/sbin/sshd" | while read PID;do echo -17 > /proc/$PID/oom_adj;done
为了避免重启失效,可以写入/etc/rc.d/rc.local
echo -17 > /proc/$(pidof sshd)/oom_adj
至于为什么用-17而不用其他数值(默认值为0),这个是由linux内核定义的,查看内核源码可知:
以linux-3.3.6版本的kernel源码为例,路径为linux-3.6.6/include/linux/oom.h,阅读内核源码可知oom_adj的可调值为15到-16,其中15最大-16最小,-17为禁止使用OOM。oom_score为2的n次方计算出来的,其中n就是进程的oom_adj值,所以oom_score的分数越高就越会被内核优先杀掉。
当然还可以通过修改内核参数禁止OOM机制
# sysctl -w vm.panic_on_oom=1
vm.panic_on_oom = 1 //1表示关闭,默认为0表示开启OOM
# sysctl -p
‘拾’ java进程怎么安全关闭
就是有个main方法在死循环的查数据处理数据。然后要更新代码,不能直接kill呀,kill会把正在处理的数据弄丢,就需要在个监控,可以再跑的过程里让他停止读取数据,然后把内存里的数据处理完了再关闭