interrupt方法使用详解,如何使用interrupt方法?

13 篇文章 0 订阅
订阅专栏

一.interrupt方法

结束线程在调用Object类的wait方法或该类的join方法、sleep方法过程中的阻塞状态,并在调用wait、join和sleep方法处产生InterruptedException异常

1.例1

import java.util.Date;

public class Test {

	public static void main(String[] args) {
		TimeThread timeThread = new TimeThread();//创建了一个线程
		timeThread.start();//调用start()方法,使timeThread线程就绪
		try {
			Thread.sleep(10000);//为了看出interrupt()方法的效果,停顿10s
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		timeThread.interrupt();//中断timeThread线程,在timeThread线程阻塞处爆发异常并处理该异常,处理完后程序向下执行,打印输出date
	}
}

class TimeThread extends Thread{

	@Override
	public void run() {
		while (true) {
			Date date = new Date();
			try {
				sleep(60000);//能直接使用sleep()方法,因为TimeThread继承自Thread类,继承了该类的方法
				System.out.println(date);//不执行,因为调用interrupt方法爆发异常后,直接由e.printStackTrace();处理异常,所以try里的语句不再执行
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(date);//处理完异常后,打印输出该句话
		}
	}
}

执行后结果在这里插入图片描述

2.例2

import java.text.SimpleDateFormat;
import java.util.Date;

class TimeThread extends Thread {

	public void run() {
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:sss");
		String beforeTime = sdf.format(new Date());
		System.out.println("beforeTime:"+beforeTime);//打印输出beforeTime:时间
		try {
			sleep(30000);// 30秒后执行后面代码,timeThread线程阻塞
			//timeThread.interrupt()该方法调用后,中断阻塞,该处爆发异常
		} catch (Exception e) {
			System.out.println("程序捕获了InterruptedException异常!");//处理异常,打印输出
		}
		String afterTime = sdf.format(new Date());
		System.out.println("afterTime:"+afterTime);//打印afterTime:时间
	}
}

public class Program {
	public static void main(String[] args) {//主线程
		TimeThread timeThread = new TimeThread();//创建timeThread线程
		timeThread.start();//timeThread线程就绪
		try{
			Thread.sleep(1000);//主线程阻塞1s
		}catch(InterruptedException e){
			e.printStackTrace();
		}
		timeThread.interrupt();
	}
}

打印结果
在这里插入图片描述
理论上beforeTime和afterTime应该相差30s,但是因为该线程类执行1s后调用了interrupt方法使得该线程提前中断了阻塞状态,导致beforeTime和afterTime不相差30s

3.例3

class CounterThread extends Thread {

	Object lockObj;//定义一个全局变量

	public CounterThread(Object lockObj) {
		this.lockObj = lockObj;//给全局变量赋值
	}

	@Override
	public void run() {
		synchronized (lockObj) {
			System.out.println("计数器线程正在执行......");
			try {
				lockObj.wait();//当线程执行该行代码后,线程进入阻塞状态;但由于10秒后主线程执行了“counterThread.interrupt();”代码使得该线程阻塞状态结束
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

public class Test {

	public static void main(String[] args) {
		Object lockObj = new Object();//创建lockObj对象
		CounterThread counterThread = new CounterThread(lockObj);//创建counterThread线程,调用CounterThread的构造方法,将lockObj传进去
		counterThread.start();//counterThread调用start方法,就绪
		try {
			Thread.sleep(10000);//停顿10s
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		counterThread.interrupt();//结束counterThread线程的阻塞状态
	}
}

在这里插入图片描述

4.例4

import java.util.Date;

class TimeThread extends Thread{
	
	@Override
	public void run() {//计数器线程进入阻塞状态后,时间线程获得了CPU的使用权,进入运行状态
		for(int i=0;i<=2; i++){
			System.out.println("时间线程:"+new Date());
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}//时间线程执行完至少需要30s
		}
	}
}

class CounterThread extends Thread {
	
	private TimeThread timeThread;
	
	public CounterThread(TimeThread timeThread){
		this.timeThread = timeThread;
	}
	//计数器线程抢占到CPU的资源,优先进入运行状态
	@Override
	public void run() {
		for(int i=1;i<=3; i++){
			if(i==2){
				try {
					timeThread.join();//计数器线程进入阻塞状态,时间线程进入就绪状态
				} catch (InterruptedException e) {
					System.out.println("计数器线程提前结束阻塞状态");
				}
			}
			System.out.println("计数器线程:"+i);
		}
	}
}

public class Program {
	public static void main(String[] args) {//主线程
		TimeThread timeThread = new TimeThread();//创建timeThread线程
		timeThread.start();//timeThread线程就绪
		CounterThread counterThread = new CounterThread(timeThread);//创建counterThread线程
		counterThread.start();//counterThread线程就绪
		try {
			Thread.sleep(15000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		counterThread.interrupt();//时间线程至少需要消耗30秒才能结束,而15秒后计数器线程调用了interrupt方法致使该计数器线程提前结束阻塞状态
	}
}

执行结果
在这里插入图片描述

interrupt的用法
hello world
07-13 5126
java中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。 void interrupt()方法: 中断线程,例如当线程A运行时,线程B可以调用线程A的interrupt()方法来设置线程A的中断标志为true并立即返回。设置标志仅仅是设置标志,线程A实际上并没有被中断,它会继续往下执行。如果线程A因为调用了wait系列的函...
【面试:并发篇09:多线程interrupt 方法详解
m0_71229547的博客
07-07 704
如果有任何问题请指出,感谢。程序中,有些线程的中断需要外部干预,比如线程中存在while(true)循环,或者存在一些阻塞操作,比如 sleep、wait、join等。 中断线程的方式,如果直接使用stop、suspend等方法,对程序来说是不太严谨的,这些方法类似于直接杀死线程,可能会造成数据问题。 interrupt方法使用可以解决该问题,调用指定线程的该方法,表示向指定线程发起通知,可以执行中断线程的操作了,而具体什么时候执行,由线程自己决定,这种方式可以让程序处理更加严谨。打断 sleep,wai
线程Interrupt方法使用
a695861652的博客
03-09 628
线程Interrupt方法使用 程序中,有些线程的终端需要外部干预,比如线程中存在while(true)循环,或者存在一些阻塞操作,比如 sleep、wait、join等。 中断线程的方式,如果直接使用stop、suspend等方法,对程序来说是不太严谨的,这些方法类似于直接杀死线程,可能会造成数据问题。 interrupt方法使用可以解决该问题,调用指定线程的该方法,表示向指定线程发起通知,可以执行中断线程的操作了,而具体什么时候执行,由线程自己决定,这种方式可以让程序处理更加严谨。 循环中断 pu
《知识点004:Java使用Thread.interrupt() 中断线程
最新发布
大大大钢琴
07-27 382
2. 如果本线程是处于阻塞状态:调用线程的wait(), wait(long)或wait(long, int)会让它进入等待(阻塞)状态,或者调用线程的join(), join(long), join(long, int), sleep(long), sleep(long, int)也会让它进入阻塞状态。1、thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。
interrupt方法使用
weixin_44502237的博客
09-14 144
interrupt方法使用
interrupt方法详解
m0_55993923的博客
11-01 3195
可以使用 Thread.interrupted() 清除打断状态。LockSupport.unpark(暂停线程对象)当线程在运行中,执行到park,此时线程暂停运行。// 恢复某个线程的运行。
interrupt()方法
BryantLmm的博客
11-11 1744
title:线程中断date:2017年11月4日23:02:38今天来看看线程中断的问题。当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示
Java多线程之中断线程(Interrupt)的使用详解
09-05
`Thread.interrupt()`方法是中断线程的主要手段,但它的行为并不像字面意义上那样直接终止线程。相反,它通过设置线程的中断状态来向线程发送一个中断信号,这个信号是一个内部标志,告知线程应该停止其当前的工作。...
线程类的join、interrupt方法使用详解
lotty_wh的博客
02-26 540
经常有人会问:如何停止一个线程线程类Thread的join、sleep、interrupt方法的具体使用场景是什么?
Java线程中断:interrupt()方法详解
"这篇资源主要讨论了Java编程中线程中断的一种常见方法——`interrupt()`,以及如何正确处理线程的中断状态。" 在Java多线程编程中,`interrupt()`方法是用于通知一个线程它应该停止当前的执行流程并进行清理工作,...
interrupt方法
JinXYan的博客
03-24 714
转载:https://blog.csdn.net/qq_33797928/article/details/79450208 1、interrupt方法 使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。这里需要注意的是...
interrupt使用
西红柿炒土豆
10-09 748
interrupt字面上是中断的意思,但在Java里Thread.interrupt()方法实际上通过某种方式通知线程,并不会直接中止该线程 interrupt方法 interrupt字面上是中断的意思,但在Java里Thread.interrupt()方法实际上通过某种方式通知线程,并不会直接中止该线程。具体做什么事情由写代码的人决定,通常我们会中
Java并发编程之interrupt方法使用
thejing01的博客
11-09 180
以上是源码翻译,当线程调用interrupt时,会先检查是否有权限能够修改线程状态。打断后会进入catch,然后重新标记打断,而后可以进行料理后事的操作.interrupt方法是Thread中的方法
线程-interrupt方法详解
白蝶的博客
07-15 2625
会让此线程产生一个InterruptedException异常,结束线程的运行。但如果该异常被线程捕获住,该线程依然可以自行决定后续处理(终止运行,继续运行,做一些善后工作等等),而且这个打断阻塞中的线程是会重置标状态为。这里不建议是使用stop方法使用stop方法虽然可以强行终止正在运行或挂起的线程,但使用stop方法是很危险的。,线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断状态是否为true)我们如何在一个线程中暂停另一个线程的运行?...
Java线程interrupt方法使用要注意的问题
wang704987562的博客
02-26 2028
在项目中有这样的业务场景:调度中心终止客户端正在执行的任务。实质是一个线程终止另一个线程。我的做法是在主线程调用另外一个线程interrupt方法,被终止的线程在一个循环中处理业务逻辑,由于使用interrupt方法并不会马上终止,所以在每次循环开始前判断线程终止状态,如:但是发现Thread.currentThread().isInterrupted()一直返回false,查找资料才知道,被终止
Interrupt()方法
静思致远
09-02 6591
关于interrupt(),java的djk文档描述: Interrupts this thread. Unless the current thread is interrupting itself, which is always permitted, the checkAccess method of this thread is invoked, which may cause a Se
线程之Thread.interrupt()方法使用
sz66cm 学习随笔
11-23 1494
线程 管理 Thread interrupt 非阻塞 不可中断 interrupted
Java中interrupt使用
qq_34061132的博客
08-05 370
Java中interrupt使用 通常我们会有这样的需求,即停止一个线程。在java的api中有stop、suspend等方法可以达到目的,但由于这些方法使用上存在不安全性,会带来不好的副作用,不建议被使用。具体原因可以参考Why isThread.stopdeprecated。 在本文中,将讨论中断在java中的使用。 中断在java中主要有3个方法interrupt(),isInterrupted()和interrupted()。 interrupt(),在一个线程中调用另一个线程的i..
写文章

热门文章

  • 如何调用构造方法 12261
  • 为什么要线程池?怎么使用线程池 4238
  • interrupt方法使用详解,如何使用interrupt方法? 3852
  • 什么叫线程间的数据共享?如何实现线程间的数据共享? 3484
  • bootstrap-栅格系统(响应式布局) 2981

分类专栏

  • Java基础 4篇
  • Java高级 13篇
  • 网页
  • Java Web 2篇
  • bootstrap 3篇
  • Mybatis 1篇
  • 模块设计 3篇
  • 异常 1篇
  • SSM 1篇
  • javascript 4篇

最新评论

  • java中的堆

    卑微程序猿︴: 开始就描述错误,新生代老年代只是某部分收集器的共同特征,并不是JVM堆内存的实际划分现象

  • 如何正确学习currentThread?调用currentThread方法的程序执行过程是什么?

    nulinulizainulilx: 线程调用toString()方法,打印出来的,那个数字5是默认的优先级。

  • 如何正确学习currentThread?调用currentThread方法的程序执行过程是什么?

    道念: 这个执行结果中 为什么会有一个数字5呢

  • 在IDEA中搭建Spring MVC框架

    一瓣向日葵: 大佬写的非常好,很有用!

大家在看

  • 十九、Python基础语法(字典(dict)) 21
  • SSD |(九)ECC原理 | LDPC 846
  • 【1024程序员节丨征文】1024程序员节来临!——计算机发展史
  • C语言链表
  • 五.流程控制语句

最新文章

  • 如何调用window对象的setInterval和setTimeout方法?
  • 如何获取HTML元素所对应的javascript对象?
  • javascript如何对象创建?有哪几种方式
2019年53篇
2018年22篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家德州佛像玻璃钢人物雕塑厂家商场美陈有什么好处上海玻璃钢鹿雕塑黑龙江环保玻璃钢雕塑哪家便宜玻璃钢卡通雕塑大量制作怀化卡通人物玻璃钢雕塑设计四川玻璃钢雕塑玻璃钢动物牛雕塑厂商沈丘玻璃钢雕塑广州玻璃钢雕塑优点玻璃钢商场美陈雕塑定制潮州现代玻璃钢雕塑玻璃钢雕塑销售方式河西商场美陈布置绍兴创意玻璃钢雕塑优势鑫泰玻璃钢花盆生产白银公园玻璃钢雕塑价格洛阳玻璃钢雕塑设计平洲名人玻璃钢人物雕塑宁夏大型玻璃钢雕塑制作玻璃钢雕塑漆效果湛江市玻璃钢雕塑制作永康石柱玻璃钢雕塑武都玻璃钢雕塑报价武汉汕尾玻璃钢动物雕塑山西玻璃钢雕塑定制雕塑玻璃钢花盆长葛玻璃钢雕塑报价上海户外商场美陈生产大型玻璃钢雕塑摆件销售企业香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化