安全的终止线程

17 篇文章 0 订阅

(一)设置终止标识

public class  SysController extends Thread{

    //volatile 锁
    public volatile  boolean exit = false;

    @Override
    public void run(){
        while (!exit){
            System.out.println(SysController.currentThread().getName()+"ThreadFlag线程退出");
        }
    }

    //main 这个线程和上面的Thread-0 不能同时执行,线程执行都是并发执行,1先执行完后2在执行
    public static void main(String[] args)throws Exception {
        SysController sysController = new SysController();
        sysController.start();
        //主线程推迟3秒
        sleep(3000);
        //终止线程thread,这状态一改,上面的exit也改了,所以就停了
        sysController.exit = true;
        //main线程放弃cpu使用权
        System.out.println(sysController.currentThread().getName()+"开始另一个线程执行!!!");
        //等待run中的线程Thread-0  执行完后才能执行下面的东西
        sysController.join();
      //  sysController.exit = true;
        System.out.println(sysController.currentThread().getName()+"开始exit另一个线程执行!!!");//线程名main
        System.out.println(SysController.currentThread().getName()+"开始exit另一个线程执行!!!");//线程名main
        System.out.println("线程退出");
    }
}


在上面的代码中定义一个退出标志exit,当exit为true时,while循环退出,exit的默认值为false。在定义exit时,使用一个Java关键字的目的是保证exit内存可见性,也就是说对exit的修改会立刻对其它线程可见(Run()中的exit会变)。

(二)设置线程中断,interrupt()方法如果不设置interrupt()方法

//volatile 锁
    public volatile  boolean exit = false;

    @Override
    public void run(){
        while (!exit){
            System.out.println(Thread.currentThread().getName()+" is Running");
            try {
                System.out.println(Thread.currentThread().getName()+" 前join()");
                Thread.currentThread().join();
                System.out.println(Thread.currentThread().getName()+" 后join()");
            }catch (InterruptedException e){
                System.out.println(Thread.currentThread().getName()+"  Week up from bolck.....");
                exit = true;
            }
        }
        System.out.println(Thread.currentThread().getName()+" is exiting....");
    }

    //main 这个线程和上面的Thread-0 不能同时执行,线程执行都是并发执行,1先执行完后2在执行
    public static void main(String[] args)throws Exception {
        SysController sysController = new SysController();
        System.out.println("Starting thread...");
        sysController.start();
        System.out.println("interrupt xc"+Thread.currentThread().getName());
        Thread.sleep(3000);
        System.out.println("SysController thread..."+Thread.currentThread().getName());
        sysController.exit = true;
        //不设置interrupt()
     //   sysController.interrupt();
        Thread.sleep(3000);
        System.out.println(Thread.currentThread().getName()+" stop application....");
    }

输出:
在这里插入图片描述
小红方块没有变黑(测试类run全跑完应该是变黑的),说明一个线程还是处于join()状态,只是另一个线程执行完剩下的程序

如果一个线程阻塞了,想让它阻塞结束
1:Thread.join()。如果先join(),想让join()阻塞结束就可以用interrupt()终止阻塞。下面的一个意思
例如

blic class  SysController extends Thread{

    //volatile 锁
    public volatile  boolean exit = false;

    @Override
    public void run(){
        while (!exit){
            System.out.println(Thread.currentThread().getName()+" is Running");
            try {
                System.out.println(Thread.currentThread().getName()+" 前join()");
                Thread.currentThread().join();
                System.out.println(Thread.currentThread().getName()+" 后join()");
            }catch (InterruptedException e){
                System.out.println(Thread.currentThread().getName()+"  Week up from bolck.....");
                exit = true;
            }
        }
        System.out.println(Thread.currentThread().getName()+" is exiting....");
    }

    //main 这个线程和上面的Thread-0 不能同时执行,线程执行都是并发执行,1先执行完后2在执行
    public static void main(String[] args)throws Exception {
        SysController sysController = new SysController();
        System.out.println("Starting thread...");
        sysController.start();
        System.out.println("interrupt xc"+Thread.currentThread().getName());
        Thread.sleep(3000);
        System.out.println("SysController thread..."+Thread.currentThread().getName());
        //设置退出表示true
        sysController.exit = true;
        //设置中断
        sysController.interrupt();
        Thread.sleep(3000);
        System.out.println(Thread.currentThread().getName()+" stop application....");
    }
}

输出:sysController.interrupt(); 设置

在这里插入图片描述
说明: 设置退出表示true
sysController.exit = true;
              设置中断
sysController.interrupt();

可以中断join()的线程阻塞,主要是因为sysController.interrupt();触发InterruptedException异常从而中断join()。
2:Thread.sleep()
3:ServerSocket.accept()方法
4:Thread的interrupt()方法终止线程
5:当线程阻塞时,使线程处于不可运行状态时,即使主线程中将该线程的退出标识设为true,但是该线程此时根本无法检查循环标志,当然也就无法立即中断。

(三)废弃的方式(主要是为了面试的,废弃方式不能用):
1:
在这里插入图片描述
2:Thread.suspend
   (1)使线程暂停
   (2)不会释放类似锁这样的资源.

和Thread.suspend配对的还有Thread.resume:
   (1)使线程恢复   (2)如果之前没有使用suspend,则不起作用   (3)

3:Runtime.runFinalizersOnExit
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值