优雅的停止线程
在多线程操作之中如果要启动多线程肯定使用的是Thread类中的start()方法,而如果对于多线程需要进行停止处理,Thread类原本提供的有stop方法,但是对于这些方法从jdk1.2之后就已经将其废除了,而且一直到现在也不再建议使用了,而除了stop()方法之外,还有几个方法也被禁用了:
之所以废除掉这些方法,主要的原因是因为这些方法有可能导致线程的死锁,所以从jdk1.2开始就都不建议使用了,那现在我要停止线程需要怎么做呢?
凡是强制性停止的就会导致线程死锁
后台守护线程
现在假设有一个人,这个人有一个保镖,那么这个保镖一定是在这个人活着的时候进行守护,一旦这个人死了,保镖就没用了。所以在多线程里面可以进行守护线程的定义,也就是说如果现在主线程的程序或者其它的线程还在执行的时候,那么守护线程将一直存在,并且运行在后台状态。
在Thread类里面提供有如下的守护线程的操作方法:
可以发现所有的守护线程都是围绕在用户线程的周围,如果程序执行完毕了,守护线程也就消失了,在整个JVM里面最大的守护线程就是GC线程。
程序执行中GC线程会一直存在,如果程序执行完毕,GC线程也将消失
volatile关键字
在多线程的定义之中,volatile关键字主要是在熟悉定义上使用的,表示此属性为直接数据操作,而不进行副本的拷贝处理。这样在一些书上就将其错误的理解为同步属性了。
而如果一个属性上追加了volatile关键字,表示的就是不使用副本,而是直接操作员是变量,相当于节约了:拷贝副本、重新保存的步骤
volatile可以更快的进行变量的修改处理。
面试题:请解释volatile与synchronized的区别?
volatile主要在属性上使用,而synchronized是在代码块与方法上使用的;
volatile无法描述同步的处理,它只是一种直接内存的处理,避免了副本的操作,而synchronized是实现同步的