第五章--Java多线程和并发编程 第五节--Java多线程管理

多线程管理(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线程结束,相当于被别人强制结束,来不及去释放持有的资源)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值