在多线程开发时,停止线程是很重要的一个技术,因此,如何正确停止一个线程,对于从事多线程开发的人员是很重要且十分必要的。
1. 什么是停止线程?
所谓停止线程,就是让一个正在处理任务的线程,停止继续执行,放弃当前任务的操作。
2. 判断线程是否是停止状态的方法?
Thread.java类中提供了;两种方法进行判断,分别是:interrupted()和isInterrupted()方法。
Interrupted():测试当前线程是否已经中断。执行后具有清除中断状态的功能。
isInterrupted():测试线程都否已经中断。没有清除中断状态的功能。
3. Java中如何正确停止线程
JDK1.2以前通过使用stop()方法来停止线程。但是,JDK1.2之后,该方法就被废弃了。
为什么stop()方法被废弃而不被使用呢?原因是stop()方法太过于暴力,会强行把执行一半的线程终止。这样会就不会保证线程的资源正确释放,通常是没有给与线程完成资源释放工作的机会,因此会导致程序工作在不确定的状态下。造成数据的不同步。
JDK1.2之后Java中通常使用interrupt()方法,停止一个线程。
但是,直接调用该方法不会终止一个正在运行的线程,需要加入一个判断语句才可以完成线程的停止。例子如下:
package cn.thread.core;
/**
* 测试interrupt()方法
* @author 温暖wk
* 结论:直接调用interrupt()方法,不能正确停止线程
* 分析:因为调用interrupt()方法不能立即停止线程,仅仅是在当前线程中打了一个停止的 *标记,并不是真的停止线程。
*/
public class Demo01 extends Thread {
//重写run()方法
public void run() {
for(int i=0;i<50;i++) {
System.out.println("i="+(i+1));
}
}
public static void main(String[] args) {
Demo01 t1=new Demo01();//使用Java支持多线程的类创建线程t1
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("main catch");
e.printStackTrace();
}
t1.interrupt();
}
}
所以,在使用interrupt()方法时,加入if语句判断线程是否是停止状态,如果是,则停止后面代码的执行。例子如下:
package cn.thread.core;
/**
* 使用异常,停止线程
* @author 温暖wk
* 结论:能正确停止线程,且for循环后面的语句不会执行
* 使用抛出异常的方法解决
*/
public class Demo03 extends Thread{
@Override
public void run() {
for(int i=0;i<500000;i++) {//只有循环足够多,才能看到线程停止
if(this.interrupted()) {//用Threa.interrupted有什么不同?
System.out.println("已经是停止状态了!我要退出");
//break; for循环后面如果有语句会继续执行
try {
throw new InterruptedException();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("i="+(i+1));
}
}
public static void main(String[] args) {
Demo03 t3=new Demo03();
t3.start(); //启动一个线程
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t3.interrupt();
System.out.println("end");
}
}