定时调度的线程池
2022-05-11 21:39
337 查看
定时调度线程池
Timer
当我们需要定时进行线程的调度
@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); } }
这样线程不是异步执行的,相当于一个线程执行两个任务,而不是两个线程同时执行,不好。
ScheduledExecutorService
定时调度的线程池,对于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<Object> 对象使用get就可以得到异常信息。所以在线程可以尽量使用Callable接口。
相关文章推荐
- Spring中的定时调度(Scheduling)和线程池(Thread Pooling)
- 定时调度线程池scheduleAtFixedRate和schedule方法
- Spring中的定时调度(Scheduling)和线程池(Thread Pooling)
- 简单东西-Java定时调度线程池用法
- Spring中的定时调度(Scheduling)和线程池(Thread Pooling)
- Spring中的定时调度(Scheduling)和线程池(Thread Pooling)
- Spring中的定时调度(Scheduling)和线程池(Thread Pooling)
- Spring中的定时调度(Scheduling)和线程池(Thread Pooling)
- CDH中oozie 定时调度sqoop job
- 线程池异步定时,操作成员变量,防止并发造成数据错乱
- 基于zookeeper和quartz实现分布式定时调度
- Java实现定时调度的三种方法
- Spring 定时调度
- (求助)定时调度报错,感觉是有多个版本,去掉jar包报错
- Java线程_线程调度之线程池
- Spring4+Springmvc+quartz实现多线程动态定时调度
- spring 定时服务调度quartz
- linux(centos)crontab定时任务调度
- 基于zookeeper和quartz实现分布式定时调度
- java中基于线程池的任务调度设计