Java如何正确停止线程?

在多线程开发时,停止线程是很重要的一个技术,因此,如何正确停止一个线程,对于从事多线程开发的人员是很重要且十分必要的。
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");
    }

}

你可能感兴趣的:(java学习笔记)