龙空技术网

终止线程的方法有哪些?

兔子六号 44

前言:

而今姐妹们对“线程关闭的方式有几种”可能比较关注,小伙伴们都想要分析一些“线程关闭的方式有几种”的相关资讯。那么小编在网络上搜集了一些对于“线程关闭的方式有几种””的相关内容,希望各位老铁们能喜欢,我们快快来了解一下吧!

问:终止线程的方法有哪些?

答:在Java语言中,可以使用stop()方法与suspend()方法来终止线程的执行。

当用Thread.stop()来终止线程时,它会释放已经锁定的所有监视资源。如果当前任何一个受这些监视资源保护的对象处于一个不一致的状态,其他线程将会“看”到这个不一致的状态,这可能会导致程序执行的不确定性,并且这种问题很难被定位。

调用suspend()方法容易发生死锁(死锁指的是两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,如果无外力作用,它们都将无法推进)。由于调用suspend()方法不会释放锁,这就会导致一个问题:如果用一个suspend挂起一个有锁的线程,那么在锁恢复之前将不会被释放。如果调用suspend()方法,线程将试图取得相同的锁,程序就会发生死锁,例如,线程A已经获取到了互斥资源M的锁,此时线程A通过suspend()方法挂起线程A的执行,接着线程B也去访问互斥资源M,这时候就造成了死锁。鉴于以上两种方法的不安全性,Java语言已经不建议使用以上两种方法来终止线程了。

那么,如何才能终止线程呢?一般建议采用的方法是让线程自行结束进入Dead状态。一个线程进入Dead状态,即执行完run()方法,也就是说,如果想要停止一个线程的执行,就要提供某种方式让线程能够自动结束run()方法的执行。在实现时,可以通过设置一个flag标志来控制循环是否执行,通过这种方法来让线程离开run()方法从而终止线程。

下例给出了结束线程的方法:

上例中,通过调用MyThread的stop()方法虽然能够终止线程,但同样也存在问题:当线程处于非运行状态时(当sleep()方法被调用或当wait()方法被调用或当被I/O阻塞时),上面介绍的方法就不可用了。此时可以使用interrupt()方法来打破阻塞的情况,当interrupt()方法被调用时,会抛出InterruptedException异常,可以通过在run()方法中捕获这个异常来让线程安全退出,具体实现方式如下:

程序运行结果为:

Thread go to sleep

Thread is interupted!

如果程序因为I/O而停滞,进入非运行状态,基本上要等到I/O完成才能离开这个状态,在这种情况下,无法使用interrupt()方法来使程序离开run()方法。这就需要使用一个替代的方法,基本思路也是触发一个异常,而这个异常与所使用的I/O相关,例如,如果使用readLine()方法在等待网络上的一个信息,此时线程处于阻塞状态。让程序离开run()方法就是使用close()方法来关闭流,在这种情况下会引发IOException异常,run()方法可以通过捕获这个异常来安全地结束线程。

标签: #线程关闭的方式有几种 #线程终止函数