定时调度线程池
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接口。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/17346.html