Java如何关闭线程

大家都知道Thread类的stop方法已经为过期方法,下面提供一个优雅关闭线程的方法和强制关闭线程的方法。Worker和Thread类的test2方法是测试优雅关闭,另外一个是强制关闭。

Worker
package cn.zxw.test.thread;

/**
* @author 华安小书童
* @description 通过标识关闭线程
* @data: 2020/4/1 11:50
*/
public class Worker extends Thread {

   private volatile boolean flag = true;

   @Override
   public void run() {
       while (flag) {
           System.out.println("do someThink");
       }
   }

   public void shutdown() {
       flag = false;
   }
}
ThreadService
package cn.zxw.test.thread;

/**
 * @author 华安小书童
 * @description 执行线程,以及打断线程
 * @data: 2020/4/1 11:12
 */
public class ThreadService {

    /**
     * 执行传入线程的线程
     */
    private Thread executeThread;

    /**
     * 任务是否执行成功标识
     */
    private boolean finished = false;

    /**
     * 执行传入线程
     *
     * @param task 传入执行线程
     */
    public void execute(Runnable task) {
        executeThread = new Thread(() -> {
            Thread innerThread = new Thread(task);
            //设置为守护线程,当外层的线程执行完,它就会结束
            innerThread.setDaemon(true);
            innerThread.start();
            try {
                //当里面的线程执行完毕后才会执行外层的线程
                innerThread.join();
                finished = true;
                System.out.println("加载完毕");
            } catch (InterruptedException e) {
                System.out.println("任务超时,executeThread被打断");
            }
        });
        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(1);
            } catch (InterruptedException e) {
                //当前线程的调用者结束,自己也会结束
                System.out.println("执行线程被打断");
                break;
            }
        }
        finished = false;
    }
}
测试类
package cn.zxw.test.thread;

/**
 * @author 华安小书童
 * @description 线程测试
 * @data: 2020/4/1 11:30
 */
public class ThreadTest {

    public static void main(String[] args) {
        boolean odd = isOdd(-3);
        System.out.println(odd);
    }

    public static void test() {
        ThreadService service = new ThreadService();
        long startTime = System.currentTimeMillis();
        service.execute(() -> {
//            while (true){
//                //模拟加载一个大文件,需要很长时间
//            }
            try {
                //假设加载文件5秒就完成
                Thread.sleep(5_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        //如果超过8秒没有加载完,线程就会结束
        service.shutdown(8_000);
        long endTime = System.currentTimeMillis();
        System.out.println(endTime - startTime);
    }

    private static void test2() {
        Worker worker = new Worker();
        worker.start();
        try {
            //如果三秒没有执行完,进行关闭
            Thread.sleep(3_000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        worker.shutdown();
    }

    private static boolean isOdd(int num) {
        return (num & 1) == 1;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值