java如何关闭一个线程

看到很多人在提问在不使用废弃的stop等方法下如何去实时关闭一个线程

 
先来说一下线程关闭后台要做哪些工作
 
1、线程异常关闭,如果当前线程设置了setUncaughtExceptionHandler,并且线程是因为未捕获的异常进行关闭的,线程会调用设置给它的 Thread.UncaughtExceptionHandler 来捕获异常。
2、如果线程处于正常的关闭中,就会触发所有的已经注册的Shutdownhook。关闭钩子是使Runtime.addShutdownHook注册的尚未开始的线程。JVM并不能保证关闭钩子的开始顺序。如果关闭应用程序线程时,它仍然在运行,它们将与关闭进程并发执行。
3、当所有关闭钩子结束的时候,如果当前线程设置了 Runtime.runFinalizersOnExit为true,JVM在退出 Java 运行时前运行此终结方法,之后停止。
4、JVM不会尝试停止或中断任何关闭时仍然在运行中的应用程序线程;它们在JVM最终终止时被强制退出。
 
线程的关闭方法:
 
1、调用线程已经废弃的方法stop(),Sun(Oracle)已经不建议使用.他们建议使用下面的这种方式。
2、在线程中每隔断时间监控一下影响线程状态的变量,根据变量来 + 运行方法依次返回(还可以直接扔出运行时异常来结束线程)
    下面是sun(oracle)原话"stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待"
 
   下面类里面的代码.
 
class TestThread
{
    public static void main(String[] args)
    {
        Thread1 t1=new Thread1();
        t1.start();
        int index=0;
        while(true)
        {   //这里主线程就去尝试着去中断这个线程
            if(index++==100)
            {
                t1.stopThread();
                t1.interrupt();
                break;
            }
            System.out.println(Thread.currentThread().getName());
        }
        System.out.println("main() exit");
    }
}  
  
class Thread1 extends Thread
{
    //判断当前的线程是否要停止。
    private boolean bStop=false;
    public synchronized void run()
    {
       //通过使用while来确定线程是否要停止
        while(!bStop)
        {
            try
            {
            //这里肯定是下面的结果执行完了之后再去判断
            //有很多人希望发出中断信息后直接停止当前线程
            //这种方式是不可取的.
            //当然如果线程处于中断等待状态,你可以使用interrupt取消等待.
                wait();
            }
            catch(InterruptedException e)
            {
                //e.printStackTrace();
                if(bStop)
                    return;
            }
            System.out.println(getName());
        }
    }
    public void stopThread()
    {
        bStop=true;
    }
}


上面只是列出了一些线程简单的监控,对于一些简单的程序来说已经够用.如果特别复杂的话,还需要自己在这个基础上实现适合自己的线程状态控制。
如果想做到发出命令后立刻关闭,那么在线程正在处理的业务逻辑中就要实时的去验证相应的变量是否发生变化.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧米优

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值