图解定时任务线程池
线程池概念
我们上篇文章分析了ThreadPoolExecutor,如果要用一句话说明它的主要优势,就是线程置换。还有Executors工具类,极大的简化了研发人员工作。
我用一个图重复描述下线程池概念。多生产-多消费模型。

生产者将线程任务丢进线程池中,生产者就就结束了。
线程池控制消费者消费元素,消费者可以是1个或者多个,取决于线程池参数corePoolSize和maxPoolSize设置。
阻塞队列是用来装生产者丢进去的线程任务,如ArrayBlockingQueue,LinkedBlockingQueue,DelayedQueue等。如果生产者生产能力超过消费者消费能力,如果阻塞队列有长度限制并且超过队列长度线程池会执行饱和策略,如果队列没有长度限制,可也能出现OOM哦,因为线程任务可能把内存都撑爆了,这也是面试常考点哦!
详细概念可以翻看我上一篇文章《线程池面试必考问题》。
定时任务延时原理
还记得我们上面说的阻塞队列吗?定时任务线程池底层使用

DelayedQueue底层需要实现
scheduleWithFixedDelay和scheduleAtFixedRate区别

scheduleWithFixedDelay:是以任务结束时间周期运行。 scheduleAtFixedRate:是以固定周期运行。
FutureTask获取返回值

Timer比较
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
/**
* @author :jiaolian
* @date :Created in 2021-02-25 13:50
* @description:Timer任务异常,Timer线程退出!
* @modified By:
* 公众号:叫练
*/
public class TimerTaskExceptionTest {
public static void main(String[] args) throws InterruptedException {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("first_task");
}
},0,1000);
TimeUnit.SECONDS.sleep(3);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("second_task");
int x = 5/0;
}
},0,1000);
}
}
总结
今天我们介绍了线程池中面试中几个重要的面试点,整理出来希望能对你有帮助,写的比不全,同时还有许多需要修正的地方,希望亲们加以指正和点评,喜欢的请点赞加关注哦。