定时调度的线程池

定时调度线程池

当我们需要定时进行线程的调度

@Slf4j
public class Test5 {
    public static void main(String[] args) {
        Timer timer = new Timer();
        log.debug("开始了");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                log.debug("hello");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },1000);
    }
}

这样线程不是异步执行的,相当于一个线程执行两个任务,而不是两个线程同时执行,不好。

定时调度的线程池,对于API不过多赘述,感觉这种还得看源码学场景,而且基本上线程池都是自己定义不使用JDK自带的。他这个就是阻塞队列是无限大的,当请求太多了就会出现OOM。

@Slf4j
public class Test6 {

    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
        log.debug("开始");
        scheduledExecutorService.schedule(()->{
            log.debug("进行调度咯");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },1, TimeUnit.SECONDS);
        scheduledExecutorService.scheduleAtFixedRate(()->{
            log.debug("鸡汤来喽");
        },1,1,TimeUnit.SECONDS);
    }

}

对于处理线程池中的线程异常,对于以下情况

scheduledExecutorService.schedule(()->{
    log.debug("进行调度咯");
    int i = 1 / 0;   // 出现错误,但是运行时却不会抛出异常。
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
},1, TimeUnit.SECONDS);

在线程池中的线程出现错误,但是并不会在控制台打印异常。

解决方法

  • 在线程中进行try catch处理异常打印出来
  • 使用Callable接口,对于返回的Future

Original: https://www.cnblogs.com/duizhangz/p/16260032.html
Author: 大队长11
Title: 定时调度的线程池

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/599423/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球