多线程管理(4):
----线程被动地暂停和终止(自己wait了,自己不能解脱,非要得到别的线程notify,才可以解脱)
依靠别的线程来拯救自己
没有及时释放资源(比如打开了一个文件,拿着一个锁对象,别的线程是拿不到这些资源的)
----希望线程能够主动暂停和终止
定期监测共享变量(别人需要我做什么,他可以把值放在共享变量上,我去定期监测,我根据共享变量的变化做动作)
如果需要暂停或者终止,先释放资源,再主动做动作
暂停:Thread.sleep(),休眠
终止:run方法结束,线程终止
参看例子InterruptTest.java
解释:对于t1来说,它是被动的,它只有被别的线程被动的interrupt一次,会使得程序中调用interrupted()函数的地方爆发出一个异常,当它在睡眠的时候(Thread.sleep(1000)),被别的线程interrupt,就会发生一个异常,e.printStackTrace()会打印这个异常信息。对于t2来说,它是主动的,会定期监控这个flag,当flag变成false时,循环不继续了,那我自己就可以退出了,我也不用爆发异常来管这个。因为如果依赖于interrupt这个标志来中断异常的话,需要自己去添加这个异常处理,而且一个地方的异常可能会让你来不及释放资源。如果自己通过定期监控这个变量,可以优雅地释放所有的资源,然后出动地退出。把命运掌握在自己手中。
多线程管理(5):
(1)多线程死锁
----每个线程互相持有别人需要的锁(哲学家吃面问题)
----如何预防死锁?需要对资源进行等级排序(比如规定好大家要拿资源,必须先拿r1,再拿r2)
参看例子:ThreadDemo5.java
有个线程查看工具jvisualvm(JDK1.8之后就没有自带了,需要独立下载安装配置)可以查看线程运行状态
(2)守护(后台)线程
---- 普通线程的结束,是run方法运行结束
---- 守护线程的结束,是run方法运行结束或者,main函数(主线程)结束
参看例子ThreadDemo4.java
注意:守护线程永远不要访问资源,如文件或者数据库等(守护线程会跟着main线程结束,相当于被别人强制结束,来不及去释放持有的资源)