我是靠谱客的博主 温柔灯泡,最近开发中收集的这篇文章主要介绍interrupt方法使用详解,如何使用interrupt方法?一.interrupt方法,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
interrupt方法
- 一.interrupt方法
- 1.例1
- 2.例2
- 3.例3
- 4.例4
一.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方法使用详解,如何使用interrupt方法?一.interrupt方法的全部内容,希望文章能够帮你解决interrupt方法使用详解,如何使用interrupt方法?一.interrupt方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复