Android高级开发工程师面试系列-线程

题目一:如何停止一个线程?
答:根据源码可知线程停止方法stop已经被废弃,所以不能直接简单的停止线程。

问题延伸1:stop方法为什么被废弃
答:因为存在线程安全问题,多线程为了解决共享资源抢占的问题,使用了锁的概念,避免资源不同步,但是正是因为此原因,stop方法却会带来更大的麻烦,它会丢弃所有的锁,导致原子逻辑受损。假如一个线程正在执行:synchronized void { x = 3; y = 4;} 由于方法是同步的,多个线程访问时总能保证x,y被同时赋值,而如果一个线程正在执行到x = 3;时,被调用了 stop()方法,即使在同步块中,它也干脆地stop了,这样就产生了不完整的残废数据。而多线程编程中最最基础的条件要保证数据的完整性,所以请忘记线程的stop方法,以后我们再也不要说“停止线程”了。而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果 很难检查出真正的问题所在。

问题延伸2:那么如何停止一个线程?
1.通知目标线程自行结束,而不是强制停止
2.目标线程应当具备处理中断的能力

第一种方法:中断方式 interrupt
通过线程的interrupt方法去中断一个线程,在线程的执行方法中调用isInterrupt方法判断线程是否中止了,如果已经中止,则不执行方法中相应的逻辑处理。

第二种方法:Boolean标记位
定义一个volatile boolean isStop标记位,可以在外面给修改isStop的值,在线程的执行方法中判断isStop状态来判断是否执行线程的方法,这里需要注意的是定义的布尔值必须用volatile 来修饰,如果不加存在线程可见性问题,加了volatile 告诉java虚拟机isStop是个易变的参数,在外面一旦发生变化,在其它使用到此变量的地方立马能看见。

两种中断方式的区别:
1.Boolean标记为方式性能更好,因为interrupt方法底层调用了jni
2.Boolean标记为更加灵活,interrupt通过抛异常的方式来触发,Boolean标记为可通过抛异常也可以通过boolean值来判断
3.如果要使用系统的方法sleep等,则使用interrupt方法来中断线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值