Java - 多线程 - interrupt & sleep

2022/6/29 14:20:17

本文主要是介绍Java - 多线程 - interrupt & sleep,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  1. 对象与共享内存:由于Java中的对象本质上都类似于C++的结构体指针或引用,所以,多线程在处理同一个这样的变量的时候,就是在操作一块共享内存。
  2. interrupted置位及其OOP设计:Java的打断只是线程的一个flag,运行中被“打断”的线程状态依然还是运行态Runnable的,是否采纳被打断的外部请求进而终止运行的决定权在被“打断”的线程自己。所以,与其说是打断,不如说是被打扰。方法interrupt用于“打断”一个线程,其实就是给被打断的线程对象置位了interrupted。判断一个线程是否被置位“打断”了的方法有两个:静态方法interrupted判断当前线程是否被打断了,它会清除掉interrupted置位;而动态对象方法isInterrupted不会清除置位。可以通过任意线程对象调用静态方法interrupted,但使用线程类方法的方式Thread.interrupted更不容易引起混淆。静态方法清除置位的缘由,是它针对的是当前线程,而当前运行的线程本来就处理这个被打断的讯息,并进而允许被再次打断。而动态对象方法就仅仅只是查看线程对象的状态,它基本就只是一个给其他线程用的一个get接口。Thread.interrupted其实就是Thread.currentThread.isInterrupted外加清除interrupted置位,只不过,基本上应该不会使用Thread.currentThread.isInterrupted这样仅仅获取状态而不进行实际处理的接口,而一旦处理了,一般也就会允许继续被打断。
  3. getId可以获取线程的ID,是一个很好的调试日志的标志。getState可以获取线程的状态。
  4. sleep(Timed_waiting)与interrupted(interrupt)的互斥及其异常抛出:sleep也是一个静态方法,同样是作用于当前在运行的线程,使其以millis为时间单位睡眠。睡眠是一种完全自主的行为。睡眠中的线程状态是Timed_waiting的,正在固定时间等待,即睡眠的线程被打断时,正在睡眠的线程会真的被打断,以抛出异常InterruptedException的方式。睡眠状态是自主进入的等待定时醒来的状态,它定时醒来,或提前被打断而醒来。反之,置位被打断的interrupted的运行态Runnable的线程尝试睡眠sleep时,也会抛出该异常。最后,抛出异常的时候,打断状态也会被去置位,这在Timed_waiting睡眠状态被打断而进入Runnable状态的过程中是短暂被置位又迅速被去置位的,而在被打断的Runnable的线程尝试睡眠的时候则只涉及去置位。抛出异常与去置位的行为是一致的,都提示着,这个讯息是必须处理的。两种抛出异常的行为也是一致的,如果睡眠可以被打断,即,被打断这个讯息的处理优先级要高于继续睡眠,那么,在进入睡眠前,自然,也有必要确认没有被打断的讯息。极端情况下,在当前线程确认没有被打断的时候,在进入睡眠的时候,此时,线程被打断了,线程进入睡眠以后,就无法再次感知到被打断的这个讯息了。所以,进入睡眠这个过程必须和置位interrupted是互斥的。sleep的时候,加锁,保证interrupted的置位无法被修改,在确认interrupted未置位并进入睡眠状态的之后,才会释放锁,允许后续对该线程的interrupt操作。


这篇关于Java - 多线程 - interrupt & sleep的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程