调用中断是如何让线程抛出异常的?
每个线程都一个关联的布尔属性来表示其中断状态,中断状态的最终为false,当一个线程被其他线程调用Thread.interrupt()方法中断时,会根据实际情况做出响应。
1.若线程正在执行一些低级的可中断方法如:Thread.sleep()、Thread.join()、Object.wait()时阻塞的线程就会苏醒并抛出interruptException异常并重置中断状态为false
2.若没有执行这些方法,则处于不可中断的阻塞状态或正常运行状态,仅通过Thread.interrupt方法设置了中断状态为true,线程自身逻辑通过轮询中断状态就可以让线程停止并重置中断状态为false
Java的线程状态都有哪些
新的、运行、等待、超时等待、阻塞、终止

解析:线程实例化调用start方法,就处于就绪状态,经过操作系统的系统调度,就会决定哪个线程来作为运行中线程
WATING状态:若是线程调用了上半方法,那么就会处于无限时的等待状态,需要下面的方法来唤醒,唤醒后重新处于就绪状态

TIMED_WAITING状态:若是线程调用了上半方法,那么就会处于有限时的等待状态,可以用下面的方法来提前唤醒,唤醒后重新处于就绪状态

在synchronized 代码块里运行的线程会有锁,来防止其他线程来运行,只有持有锁的线程运行完了其他线程才有机会持有锁来运行,当一个线程尝试访问synchronized 方法时,因为没有锁会陷入阻塞状态,只有等运行中线程完成后,才会从阻塞的线程苏醒为就绪状态来抢锁,若没抢到则再次阻塞

执行完成后就会终止
sleep和wait的区别
| 类别 | Thread类(静态方法) | Object类(实例方法) |
| 锁释放 | ❌ | ✅ |
| 使用前提 | 任何位置调用 | 必须在同步块内(持有锁) |
| 唤醒机制 | 超时自动恢复 | 需notify()/notifyAll()或超时 |
| 设计目的 | 暂停线程执行,不涉及锁协作 | 线程间协调,释放锁让其他线程工作 |
类别:sleep()是Thread类的静态方法,在任何地方都可以通过Thread对象来调用,而wait()方法是Object类的实例方法,意思是需要实例对象来调用
锁释放:sleep不会让线程释放锁,会一直持有锁,wait会释放锁,让其他线程来获取锁
使用前提:sleep在任何时候都能调用,而wait只有在同步块也就是sychronized代码块里才能使用,使用后会释放锁
唤醒机制:sleep虽是超时等待但不涉及线程协作所以notify不能唤醒,自动恢复,而wait必须要用notify或notifyAll或超时唤醒
补:notify()只能唤醒调用同一个对象的中等待的线程,而sleep不会进入对象的线程池(因为不释放锁)所以不会被唤醒
sleep会释放cpu吗
会释放cpu
线程调用sleep后会释放自身的cpu片,其他线程就有机会获得cpu片来执行,但sleep不会释放锁,所以只有不需要访问持有锁的sychronized代码块的线程才可以得到cpu片,而需要访问的依旧会陷入阻塞状态
网硕互联帮助中心



评论前必须登录!
注册