汽车
暂停线程(终止线程的方法有哪些?)
终止线程的方法有哪些?nerror="javascript:errorimg.call(this);">

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

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

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

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

终止线程的方法有哪些?nerror="javascript:errorimg.call(this);">

程序运行结果为:

Thread go to sleep

Thread is interupted!

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


顶一下()     踩一下()

热门推荐

发表评论
0评