java线程中断记录

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

总结

即使当前线程运行结束,依然可以正常退出。

发布了22 篇原创文章 · 获赞 4 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_32510597/article/details/105302184