线程池 — 停止线程池中线程、正确处理线程池中线程的异常

本文介绍了Java线程池的使用,包括四种类型的线程池创建方式。强调提交到线程池的任务应能被中断,以确保有效响应shutdownNow。讨论了如何处理线程池中的异常,提出两种方法:继承ThreadPoolExecutor重写相关方法或使用UncaughtExceptionHandler。还提醒在使用ThreadLocal时注意及时清理,以避免线程复用带来的问题。
摘要由CSDN通过智能技术生成

java自带的线程池

java提供了一个非常好用的工具类Executors,通过Executors我们可以非常方便的创建出一系列的线程池:

Executors.newCachedThreadPool,根据需要可以创建新线程的线程池。线程池中曾经创建的线程,在完成某个任务后也许会被用来完成另外一项任务。

Executors.newFixedThreadPool(int nThreads) ,创建一个可重用固定线程数的线程池。这个线程池里最多包含nThread个线程。

Executors.newSingleThreadExecutor() ,创建一个使用单个 worker 线程的 Executor。即使任务再多,也只用1个线程完成任务。

Executors.newSingleThreadScheduledExecutor() ,创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期执行。

需要更多Java知识点和面试题的朋友可以点一点下方链接免费领取

链接:1103806531暗号:CSDN

在这里插入图片描述

提交给线程池的线程要是可以被中断的

ExecutorService线程池提供了两个很方便的停止线程池中线程的方法,他们是shutdown和shutdownNow。

shutdown不会接受新的任务,但是会等待现有任务执行完毕。而shutdownNow会尝试立马终止现有运行的线程。

那么它是怎么实现的呢?我们看一个ThreadPoolExecutor中的一个实现:

    public List<Runnable> shutdownNow() {
   
        List<Runnable> tasks;
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
   
            checkShutdownAccess();
            advanceRunState(STOP);
            interruptWorkers();
            tasks = drainQueue();
        } finally {
   
            mainLock.unlock();
        }
        tryTerminate();
        return tasks;
    }

里面有一个interruptWorkers()方法的调用,实际上就是去中断当前运行的线程。

所以我们可以得到一个结论,提交到ExecutorService中的任务一定要是可以被中断的,否则shutdownNow方法将会失效。

    public void correctSubmit(){
   
        Runnable runnable= ()->{
   
            
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值