终止线程的执行

目录

一、强制终止线程的执行

强制终止用的是stop()方法,因为这种方法会丢失数据,所以一般不采用这种方法。

原理是直接杀死线程,这样的话线程中没有保存的数据就会丢失

/*
在java中强制终止一个线程
 */

public class ThreaTest09 {
    public static void main(String[] args) {
        Thread t=new Thread(new Thread09());
        t.setName("t");
        t.start();
        try {
            Thread.sleep(1000*5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //stop()强行终止,容易丢失数据,这种方式是直接杀死线程,线程没有保存的数据会丢失。不建议使用
        t.stop();

    }

}
//一秒打印一个数字
class Thread09 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"---->  begin"+i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}

输出:

t---->  begin0
t---->  begin1
t---->  begin2
t---->  begin3
t---->  begin4

可以看出,我们在主线程当中的休眠5s并没有执行!

二、合理终止线程的执行

既然上面那种方法会有容易丢失数据的缺点,那么我们在线程的操作中怎么去合理终止线程的运行呢?

我们可以定义一个布尔值,用来控制线程的结束

代码:

public class ThreadTest10 {
    public static void main(String[] args) {
        Thread10 thread10 = new Thread10();
        Thread t=new Thread(thread10);
        t.setName("t");
        t.start();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread10.run=false;
    }

}
class Thread10 implements Runnable{
    boolean run=true;
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            if (run){
                System.out.println(Thread.currentThread().getName()+"----->"+i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                }else {
                //终止当前线程
                //return就是结束,如果还有未保存的可以在这里执行保存,然后再结束
                //save....
                
                return;
            }

        }

    }
}

输出:

t----->0
t----->1
t----->2
t----->3
t----->4

可以看出在程序中正常执行,当主线程休眠5s之后就调开始执行,把true改为false停止了程序,线程正常结束!