117-Thread API综合实战,编写ThreadService实现暴力结束线程的综合实战

思考:

在读操作的过程中线程被阻塞住blocked。此时没有机会打断或读flag,线程不能监听到打断操作。这种情况如何停止线程?暴力。

@Override
public void run() {
    // connection or read file
}

此时,在JDK提供的方法中只有stop()可能通过暴力的方式关闭线程,但是stop()已经被官方不推荐使用。可以通过一些小技巧来实现,操作方法如下。

JDK提供的方法不能使用,此时自己封装一个Service。

思路:把任务线程设置为调用线程的守护线程,通过main来启动调用线程,从而执行任务线程。当需要停止线程的时候只需要中断调用线程即可,调用线程生命周期结束时,为守护线程的任务线程会自动停止。

public class ThreadService {
    // 调用线程
    private Thread executeThread;
    private boolean finished = false;

    /**
     * 执行线程
     * @param task 任务
     */
    public void execute(Runnable task) {
        this.executeThread = new Thread(() -> {
            // 任务执行线程
            Thread runner = new Thread(task);
            runner.setDaemon(true);

            runner.start();
            try {
                runner.join();
                finished = true;
            } catch (InterruptedException e) {}
        });
        this.executeThread.start();
    }

    /**
     * 关闭线程
     * @param mills 线程最长执行时间(单位:毫秒)
     */
    public void shutdown(long mills) {
        long currentTime = System.currentTimeMillis();
        // 当任务未完成执行。
        while (!finished) {
            // 如果超时。
            if (System.currentTimeMillis() - currentTime >= mills) {
                System.out.println("任务超时,需要结束线程!");
                executeThread.interrupt();
                break;
            }
            // 既未完成任务,也没超时
            try {
                Thread.sleep(0, 1);
            } catch (InterruptedException e) {
                System.out.println("执行线程被打断!");
                break;
            }
        }
        finished = false;
    }
}

通过main调用实现启动线程和中断线程。

public static void main(String[] args) {
    ThreadService service = new ThreadService();
    long startTime = System.currentTimeMillis();
    service.execute(() -> {
        // 1. load a very heavy resource.
        /*while (true) {
        }*/

        // 2. 线程执行5s后结束
        try {
            Thread.sleep(5_000);
        } catch (InterruptedException e) {
        }
    });
    service.shutdown(10_000);
    long endTime = System.currentTimeMillis();
    System.out.println("执行时间为:" + (endTime - startTime));
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com

文章标题:117-Thread API综合实战,编写ThreadService实现暴力结束线程的综合实战

文章字数:451

本文作者:神秘的小岛岛

发布时间:2019-11-23, 21:59:41

最后更新:2019-11-24, 16:32:15

原始链接:https://www.tuyrk.cn/wang-thread/117-force-stop-thread/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏