线程中断interrupt导致sleep产生的InterruptedException异常
创始人
2024-05-30 19:57:18
0

强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。

Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)静态方法

当线程睡眠时,它睡在某个地方,在苏醒之前不会返回到可运行状态。

当睡眠时间到期,则返回到可运行状态。

线程睡眠的原因:线程执行太快,或者需要强制进入下一轮,因为Java规范不保证合理的轮换。

睡眠的实现:调用静态方法。

    try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace(); }

睡眠的位置:

为了让其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。这样才能保证该线程

执行过程中会睡眠。


当一个线程调用sleep方法处于阻塞状态的过程中,这个线程的中断方法interrupt被调用时,

thread.interrupt();  中断线程

则sleep方法立刻会抛出InterruptedException中断异常,此时该线程的睡眠阻塞被打断。

java.lang.InterruptedException: sleep interruptedat java.base/java.lang.Thread.sleep(Native Method)at com.yc.myshop.ui.widget.DateUI$1.run(DateUI.java:73)at java.base/java.lang.Thread.run(Thread.java:833)org.eclipse.swt.SWTException: Failed to execute runnable (org.eclipse.swt.SWTException: Widget is disposed)

     * Thread.interrupted()来判断当前线程是否中断* 可以使用Thread.interrupted()方法来检查当前线程的是否中断(并隐式重置为false)。又由于它是静态方法,因此不能在特定的线程上使用,* 而只能报告调用它的线程的中断状态,如果线程被中断,而且中断状态尚不清楚,那么,这个方法返回true。与isInterrupted()不同,* 它将自动重置中断状态为false,第二次调用Thread.interrupted()方法,总是返回false,除非中断了线程。* 源码:public static boolean interrupted() {return currentThread().isInterrupted(true);  静态方法,一定要清楚咯}private native boolean isInterrupted(boolean ClearInterrupted);
    * isInterrupted()来判断线程是否被中断(不是静态方法,对象调用,判断什么线程都可以啊)(说白了就是简单地查询中断,不会去修改状态,非静态的对象调用的方法就是好)* 从结果可以看出,当线程被中断后,Thread.currentThread().isInterrupted()的结果就被一直是ture,与interrupted()不一样,不会重置会false;这一点要区分开* 源码:public boolean isInterrupted() {return isInterrupted(false); 非静态方法,就清除咯}private native boolean isInterrupted(boolean ClearInterrupted);

Thread.Sleep(0) 并非是真的要线程挂起0毫秒,意义在于这次调用Thread.Sleep(0)的当前线程确

实的被冻结了一下,让其他线程有机会优先执行。

Thread.Sleep(0) 是你的线程暂时放弃cpu,也就是释放一些未用的时间片给其他线程或进程使用,

就相当于一个让位动作。

在线程没退出之前,线程有三个状态,就绪态,运行态,等待态。sleep(n)之所以在n秒内不会参与CPU竞争,是因为,当线程调用sleep(n)的时候,线程是由运行态转入等待态,线程被放入等待队列中,等待定时器n秒后的中断事件,当到达n秒计时后,线程才重新由等待态转入就绪态,被放入就绪队列中,等待队列中的线程是不参与cpu竞争的,只有就绪队列中的线程才会参与cpu竞争,所谓的cpu调度,就是根据一定的算法(优先级,FIFO等。。。),从就绪队列中选择一个线程来分配cpu时间。

而sleep(0)之所以马上回去参与cpu竞争,是因为调用sleep(0)后,因为0的原因,线程直接回到就

绪队列,而非进入等待队列,只要进入就绪队列,那么它就参与cpu竞争。


相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...