为什么要有中断技术
某些场景,需要强制结束处于冻结状态(sleep,wait)的线程时,立即改变其冻结状态,让其回到阻塞状态,待获取到CPU执行权后,在catch块中改变run()执行标记,实现将线程停止的目的。
interrupt 线程中断技术,实际上就是用强制的方式来改变线程的状态
将处于冻结状态的线程,由冻结状态--->阻塞状态
冻结状态:sleep(time),wait() ,没有执行资格,没有执行权
阻塞状态:具备执行资格,正等待CPU执行权
sleep(time) 必须待时间到才能醒,如果interrupt,则睡眠状态被清除,立即醒;
wait() 由notify()/notifyAll()来唤醒,如果interrupt,则等待状态被清除,不再等待
interruptedException异常
强制将处于冻结状态的线程改变为阻塞状态,使其具备CPU执行资格。
由于这个强制动作破坏了程序预期的执行过程,将抛出interruptedException异常。此时,就需要在catch到interruptedException时,重新对线程的运行环境进行设置。
===================================================================================
如何停止处于冻结状态的线程---使用中断技术
要让线程停止,即让run()执行结束。
通常设置标记来控制线程是否继续执行。
如果多线程都处于了冻结状态,则无法读取标记进行判断,此时就需要使用中断技术,强制解除其冻结状态,回到运行状态去读取新的标记值,达到结束线程的目的!
package com.gc.thread; /** * 中断: * 不是将线程停止,而是强制解除睡眠或等待状态的线程,将其状态切换到阻塞状态,具备执行资格 * 当被分配到CPU执行权后,将继续执行catch-InterruptedException块中的代码,此处可以做一些控制: * 改变运行环境中的资源,让线程继续执行; * 改变标记,控制线程是否继续执行; * 其它... */ public class InterruptThread implements Runnable{ boolean flag = true; public void changeFlag() { flag = false; } public void run() { synchronized(this) { while(flag) { try { System.out.println(Thread.currentThread().getName()+"---waiting"); //线程处于wait状态,释放锁,让其它线程可以进入 wait(); } catch(InterruptedException e) { System.out.println(Thread.currentThread().getName()+"---interrupted"); //线程被中断,回到阻塞状态,当其获得CPU执行权后,在此处改变多线程执行标记,将其停止! changeFlag(); } } System.out.println(Thread.currentThread().getName()+"---"+"over!"); } } public static void main(String[] args) throws InterruptedException { InterruptThread runnable = new InterruptThread(); Thread t1 = new Thread(runnable); Thread t2 = new Thread(runnable); t1.start(); t2.start(); //让t1和t2都处于冻结状态 Thread.sleep(10); t1.interrupt();//解除t1线程的冻结状态,此时t1线程抛出InterruptedException,由catch块捕获,对标记进行改变 t2.interrupt();//解除t2线程的冻结状态,此时t2线程抛出InterruptedException,由catch块捕获,对标记进行改变 } }
相关推荐
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
java线程中断之interrupt和stop.docx
interrupt字面上是中断的意思,但在Java里Thread.interrupt()方法实际上通过某种方式通知线程,并不会直接中止该线程
arduino_esp8266Interrupt中断样例
interrupt(),在一个线程中调用另一个线程的interrupt()方法,即会向那个线程发出信号——线程中断状态已被设置。至于那个线程何去何从,由具体的代码实现决定。 isInterrupted(),用来判断当前线程的中断状态...
C#多线程教材 入门 概述与概念 创建和开始使用多线程 线程同步基础 同步要领 锁和线程安全 Interrupt 和 Abort 线程状态 等待句柄 同步环境 使用多线程 单元模式和Windows Forms BackgroundWorker类 ...
MCS51 中断interrupt
一个线程join另一个线程,(包括和interrupt互动的用法)3---马克-to-win java视频
在java中,线程的中断(interrupt)只是改变了线程的中断状态,至于这个中断状态改变后带来的结果,那是无法确定的,有时它更是让停止中的线程继续执行的唯一手段。不但不是让线程停止运行,反而是继续执行线程的...
方法结束线程使用interrupt()方法来中断线程有两种情况: 1. 线程处于阻塞状态:如使用了sleep,同步锁的wait,socket中的receiver,accept等方法时,会使线程处于阻塞状态。当调用线程的interrupt()方法时,会抛出...
java线程中的interrupt,isInterrupt,interrupted方法
线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法(礼让)、join方法(合并)、interrupt()方法(中断),线程的生命周期 线程 与 进程 的关系:**有一个进程中至少包含一个线程 **...
多线程 进程和线程 并发和并行 多线程的利弊 什么是上下文切换? 线程的优先级 线程的几种状态 sleep方法和wait方法的区别 stop,suspend,resume等方法为什么会被遗弃 interrupt,interrupted,isInterrupted方法区别 ...
主要介绍了Java线程Thread之interrupt中断解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
使用turbo c提供interrupt关键,在每次时间片中断函数时保存现场的功能实现函数之间的切换;加上TCB管理的结构体,实现线程调度。 物理文件的存储结构 引导块区 FAT区 i节点区 数据区 实现的命令集 命令名称 使用...
Thread.interrupt()方法的使用以及使用它退出线程
线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以...
一个线程join另一个线程,(包括和interrupt互动的用法)1---马克-to-win java视频
通俗来说,计算机外设,比如键盘发生事件(比如按下一个键)会通知到CPU, 这时CPU忙完手头的指令,就会转而执行对应的中断程序。 这句话太通俗,太笼统。那么下面细说。
看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...