1、场景介绍
想象在一个IO密集型的工作场景。开发者使用多线程处理此类工作。由于此类工作十分耗时,用户有时忍受不了,直接停止该进程。如何做到呢?
2、模拟案例
假设有个耗时任务doSpendTimeThings
,这是一个死循环,目的就是模拟耗时任务。
/**
* 死循环 ,模拟耗时任务
*/
public static void doSpendTimeThings() {
while (true) {
;
}
}
实现一个工作线程ThreadQuit
,该线程主要任务就是处理耗时任务。**注意:**不能在quit()
方法里面直接调用Thread.currentThread().interrupt();
方法。必须在初始化的时候将Thread.currentThread()
就设置进对象。因为后期在其他线程调用的时候,Thread.currentThread()
就是其他调用线程了,中断的不是我们的耗时任务处理线程。读者可以尝试复现异常。
public class ThreadQuit implements Runnable {
private Thread currentThread;
public ThreadQuit() {
this.currentThread = Thread.currentThread();
}
public void quit() {
// Thread.currentThread().interrupt();
this.currentThread.interrupt();
}
@Override
public void run() {
System.out.println("begin doSpendTimeThings");
doSpendTimeThings();
System.out.println("end doSpendTimeThings");
}
}
最后写个测试方法测试一下,这个测试代码十分简单,直接quit()
,即可。
@Test
public void test() {
ThreadQuit tt = new ThreadQuit();
Thread t = new Thread(tt);
t.start();
try {
Thread.sleep(100);
System.out.println("begin stop");
tt.quit();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main Thread over ");
}
运行结果:
begin doSpendTimeThings
begin stop
main Thread over
Process finished with exit code 0
总结
即使当前线程运行结束,依然可以正常退出。