美文网首页
中断线程任务

中断线程任务

作者: 我想放假休息 | 来源:发表于2021-04-22 21:23 被阅读0次

    转载大佬地址:http://www.voidcn.com/article/p-uamzdkyd-bwg.html

    最近想记录一下,如何优雅的中断线程任务的方法。概括的说,有3种方法:

    1、通过thread.interrupt,当然这需要你线程任务类里,自己写"是否中断"的判断逻辑

    2、通过Future的cancel方法来实现,这也是我们这里要测试的

    3、通过Thead的实例方法stop来中断线程,当然因为粗暴和不安全已经被废弃 想的很好,也是我想用代码实现一下,于是发现了一个问题,就是实用方法2取消线程时,必须要在任务类的run方法中使用Thread.sleep(),不然不会被中断。废话不说,上代码:

    package com.nipin.datastructor;
    
    import java.util.Random;
    import java.util.concurrent.*;
    
    /**
     * Created by nipin on 16/11/28.
     * 学习如何优雅的停止一个正在执行的线程
     * 主要思路:
     * 1、通过thread.interrupt,当然这需要你线程任务类里,自己写"是否中断"的判断逻辑
     * 2、通过Future的cancel方法来实现,这也是我们这里要测试的
     * 3、通过Thead的实例方法stop来中断线程,当然因为粗暴和不安全已经被废弃
     */
    public class ThreadCancelDemo {
        public static void main(String[] args) {
            //方法1
    /*
            Thread thread = new Thread(){
                @Override
                public void run() {
                    super.run();
                    while (!isInterrupted()){
                        try {
                            Thread.sleep(100l);
                            System.out.println(Thread.currentThread().getName()+" print random :"+ new Random().nextInt());
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            thread.start();
            Thread.sleep(1000l);
            thread.interrupt();
    */
    
            //方法2
            ExecutorService executorService = Executors.newFixedThreadPool(10);
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                        while (true){
                            System.out.println(Thread.currentThread().getName()+" print random --> :"+ new Random().nextInt());
                        }
                }
            };
    
            try {
                Future<?> submit = executorService.submit(runnable);
                Thread.sleep(100l);
                boolean cancel = submit.cancel(true);
                System.out.println("是否已经取消"+cancel);
                executorService.shutdown();
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    

    只要加上Thread.sleep(),之后,就可以中断。不理解其中的道理。 看了Future, future.cancel()可以删除同步阻塞任务这个帖子后,我恍然大悟,我的任务类里写了while(true),这样的线程只有thead.stop能中断,其他的方式只是改变中断状态标志,所以要改为

     public void run() {
                    while (!Thread.currentThread().isInterrupted()){
                        System.out.println(Thread.currentThread().getName()+" print random --> :"+ new Random().nextInt());
                    }
    
    

    这样就可以中断了。

    相关文章

      网友评论

          本文标题:中断线程任务

          本文链接:https://www.haomeiwen.com/subject/xjafrltx.html