Java中如何正确停止一个线程

21 篇文章 1 订阅
7 篇文章 0 订阅

这个问题在面试过程中或者是实际开发中可能都会遇到,那么我们怎么正确停止一个线程呢?
首先说说stop命令,不是说它的好,而是不能使用stop,stop不安全,导致程序异常不安全的,
执行时会导致对象被破坏。所以这个方法被弃用了。你应该中断一个线程而不是停止他
可以使用的中断线程方法,我们应该保证线程被执行完再中断,其源码中也有注释说明,调用stop()终止一个线程会释放它已经锁定的所有监视器(这将导致沿堆栈向上传播为检查的ThreadDeath异常被抛出),若此时之前受这些被释放的监视器保护的对象存在不一致性,并且这些对象对其他线程可见,这就会导致一些意想不到的后果。
再次,说说suspend,suspend不会破坏对象。但是,如果你用一个suspend挂起一个有锁的线程,那么在锁恢复之前将不会被释放。如果调用suspend的方法线程试图取得相同的锁,程序就会死锁,同样不可取,以及resume一样,也可能发生不可预料的结果
如何优雅的停掉一个线程呢?方法有以下三种
1.void interrupt ( ) 方法: 中断线程, 例如, 当线程A 运行时, 线程B 可以调用钱程A的 i nterrupt ( ) 方法来设置线程A 的中断标志为true 并立即返回。 设置标志仅仅是设置标志, 线程A 实际并没有被中断, 它会继续往下执行。 如果线程A 因为调用了wait 系列函数、 join 方法或者sleep 方法而被阻塞挂起, 这时候若线程B 调用线程A 的interrupt ( ) 方法, 线程A 会在调用这些方法的地方抛出InterruptedException 异常而返回。
2.boolean interrupted ( ) 方法: 检测当前 线程是否被中断, 如果是返回true , 否 则返回false 。 与islnterrupted 不同的是, 该方法如果发现当前线程被中断, 则会清 除中断标志, 并且该方法是static 方法, 可以通过Thread 类直接调用。 另外从下面 的代码可以知道, 在interrupted ( ) 内部 是获取当前调用线程的中断标志而不是调 用interrupted ( ) 方法的实例对象的中断 标志。 #中断标志返回该线程的中断标记
3.boolean isinterrupted ( ) 方法: 检测当 前线程是否被中断, 如果是返回true , 否 则返回false 。 interrupted方法调用的currentThread()的navtive 方法, 而isInterrupted方法调用的实例对象的native方法。 Native方法传参: true代表清除中断标志, false代表不清除
interrupted() 返回并重置该线程的中断标记(置为false)
4.shutdown方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值