1 线程正常执行完毕,正常结束。 也就是让run方法执行完毕,该线程就会正常结束。 2 监视某些条件,结束线程的不间断运行。 然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。 通常,它们执行在一个while(true)的死循环中。 如: publicvoid run() { while(true){ someWork(); if(finished){ break; } try { Thread.sleep(10000); } catch (InterruptedException e) { /* TODO自动生成 catch 块 * */ e.printStackTrace(); } } } 我们可以在while死循环内,每次循环时,察看外部条件,看看是否需要关闭当前线程。如果是,就break,跳出死循环,或者是抛出异常,跳出死循环,结束线程。 3 捕获InterruptedException 运行时异常,中断当前线程。 有些执行伺服任务的线程,在while(true)这样的死循环内部,是一个阻塞中的方法。此时,就不能采用第二种方法了。因为,当该方法没有返回时,该线程一直处于阻塞当中,根本无法执行其他语句。 此时,就需要调用该线程的interrupt方法,产生一个InterruptedException运行时异常,是阻塞中的那个方法抛出这个异常,从而让我们有机会结束这个线程的执行。 如: publicvoid run() { while(true){ try { // getSendMessages 是BlockingQueue类。它的take方法将会阻塞! responseMessage = this.getSendMessages().take(); } catch (InterruptedException e1) { thrownew RuntimeException(); //或者break; } someWork(); } 一个外部的Thread 对象 指向这个线程。 需要结束这个线程时,只需要调用thread对象的interrupt() 方法,就会在responseMessage = this.getSendMessages()。take(); 这条语句中产生一个InterruptedException异常,从而结束该线程的阻塞状态,通过抛出异常,或者break跳出死循环,结束这个线程。
十多年的海兴网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整海兴建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联从事“海兴网站设计”,“海兴网站推广”以来,每个客户项目都认真落实执行。
在java程序中,可以使用java.lang.System的exit方法来终止程序的执行,
12345678
public static void main(String[] args) { System.out.println("开始进入程序..."); //do something System.out.println("程序准备退出了!"); System.exit(0); //下面这句话将不会打印出来 System.out.println("程序已经退出了!");}
但是使用exit方法的本质是终止了JVM的运行,如果同时运行了另外一个程序,使用exit方法同样也会使该程序也终止,要避免此种情况可以使用interrupt()来中断退出一个独立运行的过程。对于多线程程序,必须要关闭各个非守护线程。
1234567891011121314151617181920212223
public static void main(String[] args) { System.out.println("开始进入程序..."); //do something new Thread(){ public void run() { while (true) { System.out.println("我是另外的线程..."); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.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) {
// 循环里的工作
}
}
}
1.
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 = 0; i 1000; i++) { // 在这里增添您需要处理代码 }
18.
System.out.println(i);
19.
}
20.
}
21.
}
import java.applet.*;
import java.awt.Color;
import java.awt.Frame;
import javax.swing.JFrame;
import java.awt.event.*;
public class FirstFrame extends Frame {
public static void main(String args[]) {
FirstFrame fr = new FirstFrame("First contianer!");
fr.setSize(240, 240);
//继承JFrame的关闭窗口代码
//fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//继承Frame的
fr.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);//退出系统
}
});
fr.setVisible(true);
}
public FirstFrame(String str) {
super(str);
}
}